socket需要的过程
通过系统调用socket来创建一个socket
通过bind()来绑定一个端口,并且指定相应的ip类型及通讯方式
通过调用listen()监听端口的连接
调用accept()来等待用户的连接,当调用这个函数的时候系统会堵塞直到有相应的客户端连接。
#include
该头文件定义了socket的数据类型,后面的两个头文件需要包含这个头文件
#include
包含了一些socket所需的结构定义
#include
该类的是定义了一些所需要的互联网域名地址常量和结构。
voiderror(char*msg)
该类其实是将错误代码输出成文字的信息,在linuxc当中所有的错误都有一个特定的errno的,当出现错误的时候可以查看相应的编写来定位问题的原因,后面附录错误的编号
#include#include#include#include#include#include#include#include#includevoid*socketprocess(void*socket_desc);intmain(intargc,charconst*argv[]){intsock_desc,c,recv_len;int*new_sock;charclient_message[512];structsockaddr_inserver,client;**//#defineaf_inet2/*internetwork:udp,tcp,etc.*/**sock_desc=socket(af_inet,sock_stream,0);if(sock_desc<0){puts("错误");return1;}server.sin_addr.s_addr=inaddr_any;server.sin_port=htons(8888);server.sin_family=af_inet;if(bind(sock_desc,(structsockaddr*)&server,sizeof(server))<0){puts("绑定错误");}puts("绑定完成");listen(sock_desc,5);puts("正在监听等待连接");while(1){new_sock=(int*)malloc(sizeof(int));*new_sock=accept(sock_desc,(structsockaddr*)&client,(socklen_t*)&c);pthread_tthread_id;puts("接受请求");if(*new_sock!=-1){charipv4addr[100];charaddr_buf[inet_addrstrlen];socklen_tlen;if(getsockname(*new_sock,(structsockaddr*)&client,&len)==-1){perror("gesocknameerr");}printf("ip:%dn",ntohs(client.sin_port));if(pthread_create(&thread_id,0,&socketprocess,(void*)new_sock)<0){//创建一个线程perror("创建线程失败");return1;}pthread_detach(thread_id);//线程分离}puts("新客户连接");}puts("连接成功");return0;}void*socketprocess(void*socket_desc){int*csock=(int*)socket_desc;charbuffer[1024];intbuffer_len=1024;intbytecount;while(1){memset(buffer,0,buffer_len);if((bytecount=recv(*csock,buffer,buffer_len,0))==-1){fprintf(stderr,"接收数据错误,错误代码:%dn",errno);close(*csock);return(0);}printf("接收到字节数%dn接收字符串"%s"n",bytecount,buffer);strcat(buffer,"serverechon");if((bytecount=send(*csock,buffer,strlen(buffer),0))==-1){fprintf(stderr,"错误发送数据%dn",errno);close(*csock);return(0);}printf("发送字节数%dn",bytecount);}return0;}常用的错误编号