连续四天学习套接字的编程,可见套接字的重要性了。基于TCP和UDP分别写了两个程序。一是利用TCP实现一个服务器对多个客户端,客户端你发送信息,服务器就从事先准备好的五个字符串中随机回复一条。另一个是利用UDP实现两个人的对话,对话时可以是多个信息同时输入。
先是第一个程序。要实现一对多,就要使用线程编程,服务器端在不断监听中,如果有连接请求的话,就用通过accept函数接受并创建一个线程来处理。线程的创建函数为int pthread_create(pthread_t * thread, pthread_attr_t * attr, void * (*start_routine)(void *), void * arg);这个函数是一个回调函数,会调用start_routine函数指针指向的函数进行处理,后面的arg为指向函数的参数。线程还有个重要的函数是 int pthread_join(pthread_t thread, void **retval);用来等待一个线程的结束。retval用来存放线程的返回值。下面是这个程序的源代码:
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<sys/socket.h> 5 #include<netinet/in.h> 6 7 void *func(void *arg){ 8 9 int ret = 0; 10 int nfd = (int)arg; 11 char revdata[1024] = { 0}; 12 char *talk[5] = { 0}; 13 *(talk + 0) = "hello world !"; 14 *(talk + 1) = "hello bunfly !"; 15 *(talk + 2) = "hello good !"; 16 *(talk + 3) = "hello xixi !"; 17 *(talk + 4) = "hello lala !"; 18 int i = 0; 19 while(1){ 20 ret = recv(nfd,revdata,1024,0); 21 if(ret < 0){ 22 perror("recv"); 23 exit(EXIT_FAILURE); 24 } 25 ret = send(nfd,*(talk +i),strlen(*(talk+i)),0); 26 if(ret < 0){ 27 perror("recv"); 28 exit(EXIT_FAILURE); 29 } 30 printf("ret is %d\n",ret); 31 i = rand() % 4; 32 } 33 close(nfd); 34 } 35 int main() 36 { 37 /*创建套接口*/ 38 int fd = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 39 if(fd < 0){ 40 perror("socket"); 41 exit(EXIT_FAILURE); 42 } 43 /*服务端信息*/ 44 struct sockaddr_in srv; 45 srv.sin_family = AF_INET; 46 srv.sin_port=htons(9527); 47 srv.sin_addr.s_addr = inet_addr("192.168.31.200"); 48 /*绑定*/ 49 int ret = bind(fd,(struct sockaddr *)&srv,sizeof