文件管理 · 2022年9月13日

chtons头文件|如何用C语言编写一个简单的聊天室程序

A. visual c++编译器出问题了

#define MAX 200; 很显然 这里MAX被定义为一个数字,后面的 “;”是不能要的,要不就是定义了一个字符串“200;”改成这样: #define MAX 200 就ok了winsock.h 是microsoft公司做的头文件,不可能错的,这一点确信无疑,除非你自己改动了里面的内容现在所报的winsock.h错误,都是由于你自己的程序里面有错误,导致编译器顺序编译到这个文件后不通才引起的,所以重点还是检查你自己的代码

B. 能否给我一个用纯C编写的UDP发送和接收的程序

UDP的,你看下1.服务器端实现程序在收到客户端发送来的消息后,给客户端发送消息,提示客户端收到了该消息#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <netdb.h>#include <stdio.h>#include <unistd.h>int main(int argc, char *argv[]){ int sock, length, fromlen, n; struct sockaddr_in server; struct sockaddr_in from; char buf[1024]; //要求执行是输入端口信息 if (argc!= 2) { printf( "Usage: %s port_num\n",argv[0]); return 1; } //创建通信所需的套接字,并与地址和端口信息帮定 sock=socket(AF_INET, SOCK_DGRAM, 0); if (sock < 0){ perror("cannot create communicating socket"); return 1; } length = sizeof(server); bzero(&server,length); server.sin_family=AF_INET; server.sin_addr.s_addr=INADDR_ANY; server.sin_port=htons(atoi(argv[1])); if (bind(sock,(struct sockaddr *)&server,length)<0){ perror("cannot bind the socket"); close(sock); return 1; } fromlen = sizeof(struct sockaddr_in); //读取客户端发送来的信息,显示后,发回相关信息给客户端 while (1) { n = recvfrom(sock,buf,sizeof(buf),0,(struct sockaddr *)&from,&fromlen); if (n < 0) { perror("cannot receive date from client"); break; } write(STDOUT_FILENO,"server: Received a datagram: ",29); write(STDOUT_FILENO,buf,n); n = sendto(sock,"send message to client\n",22, 0,(struct sockaddr *)&from,fromlen); if (n < 0) { perror("cannot send data to the client"); break; } } close(sock); return 0; }2.客户端实现#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <netdb.h>#include <stdio.h>#include <unistd.h>int main(int argc, char *argv[]){ int sock, length, n; struct sockaddr_in server, from; struct hostent *hp; char buffer[256]; //判断输入参数是否符合要求 if (argc != 3) { printf("Usage: %s server_ip port_num\n",argv[0]); return 1; } //创建通信套接字 sock= socket(AF_INET, SOCK_DGRAM, 0); if (sock < 0) { perror("cannot create communicating socket"); return 1; } server.sin_family = AF_INET; hp = gethostbyname(argv[1]); if (hp==0) { perror("cannot get the server ip address"); return 1; } b((char *)hp->h_addr, (char *)&server.sin_addr, hp->h_length); server.sin_port = htons(atoi(argv[2])); length=sizeof(struct sockaddr_in); printf("(client) enter the message: "); bzero(buffer,256); fgets(buffer,255,stdin); //发送数据给指定服务器 n=sendto(sock,buffer,strlen(buffer),0,&server,length); if (n < 0){ perror("cannot get message from the client"); return 1; } //从服务器中接受数据 bzero(buffer,256); n = recvfrom(sock,buffer,256,0,&from, &length); if (n < 0) { perror("cannot send message to the server"); return 1; } printf("client got message : %s\n",buffer); close(sock); return 0;}

C. gethostbyname 用法 ,高手一定要帮忙看看

使用这个东西,首先要包含2个头文件:#include <netdb.h>#include <sys/socket.h>struct hostent *gethostbyname(const char *name);这个函数的传入值是域名或者主机名,例如"www.google.com","wpc"等等。传出值,是一个hostent的结构(如下)。如果函数调用失败,将返回NULL。struct hostent { char *h_name; char **h_aliases; int h_addrtype; int h_length; char **h_addr_list;};解释一下这个结构, 其中:char *h_name 表示的是主机的规范名。例如www.google.com的规范名其实是www.l.google.com。char **h_aliases 表示的是主机的别名。www.google.com就是google他自己的别名。有的时候,有的主机可能有好几个别名,这些,其实都是为了易于用户记忆而为自己的网站多取的名字。int h_addrtype 表示的是主机ip地址的类型,到底是ipv4(AF_INET),还是ipv6(AF_INET6)int h_length 表示的是主机ip地址的长度int **h_addr_lisst 表示的是主机的ip地址,注意,这个是以网络字节序存储的。千万不要直接用printf带%s参数来打这个东西,会有问题的哇。所以到真正需要打印出这个IP的话,需要调用inet_ntop()。const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt) :这个函数,是将类型为af的网络地址结构src,转换成主机序的字符串形式,存放在长度为cnt的字符串中。这个函数,其实就是返回指向dst的一个指针。如果函数调用错误,返回值是NULL。下面是例程,有详细的注释。#include <netdb.h>#include <sys/socket.h>int main(int argc, char **argv){char *ptr,**pptr;struct hostent *hptr;char str[32];/* 取得命令后第一个参数,即要解析的域名或主机名 */ptr = argv[1];/* 调用gethostbyname()。调用结果都存在hptr中 */if( (hptr = gethostbyname(ptr) ) == NULL ){printf("gethostbyname error for host:%s\n", ptr);return 0; /* 如果调用gethostbyname发生错误,返回1 */}/* 将主机的规范名打出来 */printf("official hostname:%s\n",hptr->h_name);/* 主机可能有多个别名,将所有别名分别打出来 */for(pptr = hptr->h_aliases; *pptr != NULL; pptr++)printf(" alias:%s\n",*pptr);/* 根据地址类型,将地址打出来 */switch(hptr->h_addrtype){case AF_INET:case AF_INET6:pptr=hptr->h_addr_list;/* 将刚才得到的所有地址都打出来。其中调用了inet_ntop()函数 */for(;*pptr!=NULL;pptr++)printf(" address:%s\n", inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str)));break;default:printf("unknown address type\n");break;}return 0

D. 如何用C语言编写一个简单的聊天室程序

这样:

#include <stdlib.h>

#include <stdio.h>

#include <errno.h>

#include <string.h>

#include <unistd.h>

#include <netdb.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <sys/types.h>

#include <arpa/inet.h>

#include <pthread.h>

#define MAXLINE 100;

void *threadsend(void *vargp);

void *threadrecv(void *vargp);

int main()

{

int *clientfdp;

clientfdp = (int *)malloc(sizeof(int));

*clientfdp = socket(AF_INET,SOCK_STREAM,0);

struct sockaddr_in serveraddr;

struct hostent *hp;

bzero((char *)&serveraddr,sizeof(serveraddr));

serveraddr.sin_family = AF_INET;

serveraddr.sin_port = htons(15636);

serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");

if(connect(*clientfdp,(struct sockaddr *)&serveraddr,sizeof(serveraddr)) < 0){

printf("connect error");

exit(1);

}

pthread_t tid1,tid2;

printf("connected");

while(1){

pthread_create(&tid1,NULL,threadsend,clientfdp);

pthread_create(&tid2,NULL,threadrecv,clientfdp);

}

return EXIT_SUCCESS;

}

void *threadsend(void * vargp)

{

//pthread_t tid2;

int connfd = *((int *)vargp);

int idata;

char temp[100];

while(1){

//printf("me: ");

fgets(temp,100,stdin);

send(connfd,temp,100,0);

printf(" client send OK");

}

printf("client send");

return NULL;

}

void *threadrecv(void *vargp)

{

char temp[100];

int connfd = *((int *)vargp);

while(1){

int idata = 0;

idata = recv(connfd,temp,100,0);

if(idata > 0){

printf("server :%s",temp);

}

}

return NULL;

}

(4)chtons头文件扩展阅读:

注意事项

linux下编译多线程代码时,shell提示找不到 pthread_create函数,原因是 pthread.h不是linux系统默认加载的库文件,应该使用类似如下gcc命令进行编译:

gcc echoserver.c -lpthread -o echoserver

只要注意 -lpthread参数就可以了。

E. htons和ETH_P_IP是在那个头文件里定义的

Linux/include/linux/byteorder/generic.hLinux/include/uapi/linux/if_ether.h在http://lxr.free-electrons.com/ident 里可以查到

F. VS2008VCerror C2664: “htons”: 不能将参数 1 从“CString”转换为“u_short”

把端口编辑框关联成int型,而不是CString

G. 在windows下,vc写socket多线程问题。头文件省略。运行到线程那里是就一直打印错误代码10038

数据库可以使用ACCESS,这样就可以在没有安装数据库软件的电脑上运行了。每次使用只需要臭不可闻建立数据源。k只是ODBC的很多函数在ACCESS里面不好用。

H. c语言中的 netinet/in是什么意思

名称 netinet/in.h – Internet address family netinet / in.h – 互联网地址族 SYNOPSIS故事大纲 #include <netinet/in.h> #包括<netinet/in.h> DESCRIPTION描述 The <netinet/in.h> header shall define the following types:该<netinet/in.h>头应确定以下类型: in_port_t in_port_t Equivalent to the type uint16_t as defined in <inttypes.h> .等价的类型uint16_t在定义<inttypes.h> 。 in_addr_t in_addr_t Equivalent to the type uint32_t as defined in <inttypes.h> .等价的类型uint32_t在定义<inttypes.h> 。 The sa_family_t type shall be defined as described in <sys/socket.h> .该sa_family_t类型应被定义为描述<sys/socket.h> 。 The uint8_t and uint32_t type shall be defined as described in <inttypes.h> .该uint8_t和uint32_t类型应被定义为描述<inttypes.h> 。 Inclusion of the <netinet/in.h> header may also make visible all symbols from <inttypes.h> and <sys/socket.h> .标题包含的<netinet/in.h>也可从所有可见的符号<inttypes.h>和<sys/socket.h> 。 The <netinet/in.h> header shall define the in_addr structure that includes at least the following member:该<netinet/in.h>头应确定in_addr结构,至少包括以下成员: in_addr_t s_addr in_addr_t s_addr The <netinet/in.h> header shall define the sockaddr_in structure that includes at least the following members:该<netinet/in.h>头应确定SOCKADDR_IN结构,其中包括至少下列成员: sa_family_t sin_family AF_INET. in_port_t sin_port Port number. struct in_addr sin_addr IP address. sa_family_t sin_family是AF_INET。in_port_t sin_port端口号。 结构in_addr sin_addr的IP地址。 The sin_port and sin_addr members shall be in network byte order.该sin_port和sin_addr成员应在网络字节顺序。 The sockaddr_in structure is used to store addresses for the Internet address family.该SOCKADDR_IN结构是用来存储家庭地址的Internet地址。 Values of this type shall be cast by applications to struct sockaddr for use with socket functions.值类型转换插座职能,应由申请与使用结构sockaddr的。 [ IP6 ] [ 肌醇 ] [备选案文开始] The <netinet/in.h> header shall define the in6_addr structure that contains at least the following member:该<netinet/in.h>头应确定in6_addr结构,至少包含以下成员: uint8_t s6_addr[16] uint8_t s6_addr [16] This array is used to contain a 128-bit IPv6 address, stored in network byte order.这个数组用来包含一个128位的IPv6地址,在网络存储字节顺序。 The <netinet/in.h> header shall define the sockaddr_in6 structure that includes at least the following members:该<netinet/in.h>头应确定sockaddr_in6结构,至少包括以下成员: sa_family_t sin6_family AF_INET6. sa_family_t sin6_family AF_INET6。 in_port_t sin6_port Port number. in_port_t sin6_port端口号。 uint32_t sin6_flowinfo IPv6 traffic class and flow information. uint32_t sin6_flowinfo IPv6通信类和信息流。 struct in6_addr sin6_addr IPv6 address. 结构in6_addr sin6_addr IPv6地址。 uint32_t sin6_scope_id Set of interfaces for a scope. uint32_t sin6_scope_id范围一套接口。 The sin6_port and sin6_addr members shall be in network byte order.该sin6_port和sin6_addr成员应在网络字节顺序。 The sockaddr_in6 structure shall be set to zero by an application prior to using it, since implementations are free to have additional, implementation-defined fields in sockaddr_in6 .该sockaddr_in6结构应被设置为应用零一前使用它,因为可以自由的实现有执行定义的领域sockaddr_in6增加。 The sin6_scope_id field is a 32-bit integer that identifies a set of interfaces as appropriate for the scope of the address carried in the sin6_addr field.该sin6_scope_id字段是一个32位整数,在该领域的sin6_addr标识一组接口的地址进行适当的范围。 For a link scope sin6_addr , the application shall ensure that sin6_scope_id is a link index.对于一个链接范围sin6_addr的,应当确保sin6_scope_id是一个环比价格指数。 For a site scope sin6_addr , the application shall ensure that sin6_scope_id is a site index.对于一个场址范围sin6_addr的,应当确保sin6_scope_id是一个网站的索引。 The mapping of sin6_scope_id to an interface or set of interfaces is implementation-defined.该接口映射到一个或接口sin6_scope_id集是实现定义。 The <netinet/in.h> header shall declare the following external variable:该<netinet/in.h>头应宣布下列外部变量: const struct in6_addr in6addr_any 常量结构in6_addr in6addr_any This variable is initialized by the system to contain the wildcard IPv6 address.这个变量是由系统初始化包含通配符的IPv6地址。 The <netinet/in.h> header also defines the IN6ADDR_ANY_INIT macro.该<netinet/in.h>头还定义IN6ADDR_ANY_INIT宏。 This macro must be constant at compile time and can be used to initialize a variable of type struct in6_addr to the IPv6 wildcard address.这个宏必须保持在编译时,可以用来初始化一个类型变量的结构in6_addr到IPv6的通配符地址。 The <netinet/in.h> header shall declare the following external variable:该<netinet/in.h>头应宣布下列外部变量: const struct in6_addr in6addr_loopback 常量结构in6_addr in6addr_loopback This variable is initialized by the system to contain the loopback IPv6 address.这个变量是由系统初始化,控制回路的IPv6地址。 The <netinet/in.h> header also defines the IN6ADDR_LOOPBACK_INIT macro.该<netinet/in.h>头还定义IN6ADDR_LOOPBACK_INIT宏。 This macro must be constant at compile time and can be used to initialize a variable of type struct in6_addr to the IPv6 loopback address.这个宏必须保持在编译时,可以用来初始化一个类型变量的结构in6_addr到IPv6的环回地址。 The <netinet/in.h> header shall define the ipv6_mreq structure that includes at least the following members:该<netinet/in.h>头应确定ipv6_mreq结构,至少包括以下成员: struct in6_addr ipv6mr_multiaddr IPv6 multicast address. 结构in6_addr ipv6mr_multiaddr IPv6组播地址。 unsigned ipv6mr_interface Interface index. 未签名的ipv6mr_interface接口索引。 [备选案文完] The <netinet/in.h> header shall define the following macros for use as values of the level argument of getsockopt () and setsockopt () :该<netinet/in.h>头应确定水平的论点如下宏作为值使用getsockopt()和使用setsockopt() : IPPROTO_IP IPPROTO_IP Internet protocol.互联网协议。 IPPROTO_IPV6 IPPROTO_IPV6 [ IP6 ] [ 肌醇 ] [备选案文开始] Internet Protocol Version 6. Internet协议版本6。 [备选案文完] IPPROTO_ICMP IPPROTO_ICMP Control message protocol.控制消息协议。 IPPROTO_RAW IPPROTO_RAW [ RS ] [ 遥感 ] [备选案文开始] Raw IP Packets Protocol.原始IP数据包协议。 [备选案文完] IPPROTO_TCP IPPROTO_TCP Transmission control protocol.传输控制协议。 IPPROTO_UDP IPPROTO_UDP User datagram protocol.用户数据报协议。 The <netinet/in.h> header shall define the following macros for use as destination addresses for connect () , sendmsg () , and sendto () :该<netinet/in.h>头应确定目标地址为使用如下宏连接 () , sendmsg() ,和SendTo文件 () : INADDR_ANY INADDR_ANY IPv4 local host address. IPv4的本地主机地址。 INADDR_BROADCAST INADDR_BROADCAST IPv4 broadcast address. IPv4的广播地址。 The <netinet/in.h> header shall define the following macro to help applications declare buffers of the proper size to store IPv4 addresses in string form:该<netinet/in.h>头应当载明下列事项,以帮助申请申报宏大小适当的缓冲区来存储的字符串形式的IPv4地址: INET_ADDRSTRLEN INET_ADDRSTRLEN 16. 16。 Length of the string form for IP.长度为IP字符串形式。 The htonl () , htons () , ntohl () , and ntohs () functions shall be available as defined in <arpa/inet.h> .该htonl() , htons() , ntohl() ,和ntohs()函数应可在定义<arpa/inet.h> 。 Inclusion of the <netinet/in.h> header may also make visible all symbols from <arpa/inet.h> .标题包含的<netinet/in.h>也可从所有可见的符号<arpa/inet.h> 。 [ IP6 ] [ 肌醇 ] [备选案文开始] The <netinet/in.h> header shall define the following macro to help applications declare buffers of the proper size to store IPv6 addresses in string form:该<netinet/in.h>头应当载明下列事项,以帮助申请申报宏缓冲区的大小适当的形式存储的IPv6地址的字符串: INET6_ADDRSTRLEN INET6_ADDRSTRLEN 46. 46。 Length of the string form for IPv6.长度为IPv6的字符串形式。 The <netinet/in.h> header shall define the following macros, with distinct integer values, for use in the option_name argument in the getsockopt () or setsockopt () functions at protocol level IPPROTO_IPV6:该<netinet/in.h>头应当载明下列事项宏,有明显的整数值,在参数的使用在option_name getsockopt()或使用setsockopt() IPPROTO_IPV6功能在协议级别: IPV6_JOIN_GROUP IPV6_JOIN_GROUP Join a multicast group.加入一个多播组。 IPV6_LEAVE_GROUP IPV6_LEAVE_GROUP Quit a multicast group.退出一个多播组。 IPV6_MULTICAST_HOPS IPV6_MULTICAST_HOPS Multicast hop limit.组播跳的限制。 IPV6_MULTICAST_IF IPV6_MULTICAST_IF Interface to use for outgoing multicast packets.即将离任的接口用于多播数据包。 IPV6_MULTICAST_LOOP IPV6_MULTICAST_LOOP Multicast packets are delivered back to the local application.多播数据包被传递回本地应用程序。 IPV6_UNICAST_HOPS IPV6_UNICAST_HOPS Unicast hop limit.单播跳的限制。 IPV6_V6ONLY IPV6_V6ONLY Restrict AF_INET6 socket to IPv6 communications only.限制AF_INET6到IPv6通讯插座只。 The <netinet/in.h> header shall define the following macros that test for special IPv6 addresses.该<netinet/in.h>头应当载明下列事项宏测试特殊的IPv6地址。 Each macro is of type int and takes a single argument of type const struct in6_addr * :每个宏是int 类型的常量 ,而所需的类型单一参数的结构in6_addr *: IN6_IS_ADDR_UNSPECIFIED IN6_IS_ADDR_UNSPECIFIED Unspecified address.未指定地址。 IN6_IS_ADDR_LOOPBACK IN6_IS_ADDR_LOOPBACK Loopback address.环回地址。 IN6_IS_ADDR_MULTICAST IN6_IS_ADDR_MULTICAST Multicast address.组播地址。 IN6_IS_ADDR_LINKLOCAL IN6_IS_ADDR_LINKLOCAL Unicast link-local address.单播链路本地地址。 IN6_IS_ADDR_SITELOCAL IN6_IS_ADDR_SITELOCAL Unicast site-local address.单播站点本地地址。 IN6_IS_ADDR_V4MAPPED IN6_IS_ADDR_V4MAPPED IPv4 mapped address.映射的IPv4地址。 IN6_IS_ADDR_V4COMPAT IN6_IS_ADDR_V4COMPAT IPv4-compatible address. IPv4兼容地址。 IN6_IS_ADDR_MC_NODELOCAL IN6_IS_ADDR_MC_NODELOCAL Multicast node-local address.组播节点本地地址。 IN6_IS_ADDR_MC_LINKLOCAL IN6_IS_ADDR_MC_LINKLOCAL Multicast link-local address.组播链路本地地址。 IN6_IS_ADDR_MC_SITELOCAL IN6_IS_ADDR_MC_SITELOCAL Multicast site-local address.组播站点本地地址。 IN6_IS_ADDR_MC_ORGLOCAL IN6_IS_ADDR_MC_ORGLOCAL Multicast organization-local address.组播组织本地地址。 IN6_IS_ADDR_MC_GLOBAL IN6_IS_ADDR_MC_GLOBAL Multicast global address.全球多播地址。 [备选案文完]