socket编程实现一个简单的多人通信(udp)

来源:互联网 发布:如何看网络直播 编辑:程序博客网 时间:2024/05/16 06:05

在编server程序的时候,在用recvfrom接收信息时出现-1的情况,错误为Invalid argument,在给client_len赋值后问题解决.

client_len = sizeof(struct sockaddr_in);


server程序:

<span style="color:#333333;">/*  * File Name: socket_udp_server.c  * Author: eagle  * mail: zhaocheng121@163.com  * Created Time: 2015-10-08 18:43 */#include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <net/if.h>#include <unistd.h>#include <stdlib.h>#include <string.h>#include <sys/ioctl.h>int findclient(struct sockaddr_in client_address, struct sockaddr_in client[], int *client_num);int main(int argc, char *argv[]){int server_socketfd, client_socketfd;int server_len,client_len;struct sockaddr_in server_address;struct sockaddr_in client_address;struct sockaddr_in client[100];//记录客户端信息int i, byte, client_num = 0;char recv[100], send[100];/*create socket and bind*/server_socketfd = socket(AF_INET, SOCK_DGRAM, 0); //创建socket对象server_address.sin_family = AF_INET;              server_address.sin_addr.s_addr = inet_addr("127.0.0.1"); //主机ipserver_address.sin_port = 9734;                     //主机端口server_len = sizeof(server_address);bind(server_socketfd, (struct sockaddr *) & server_address, server_len);        client_len = sizeof(struct sockaddr_in);memset(&client_address, 0, sizeof(struct sockaddr_in));while(1){if((byte = recvfrom(server_socketfd, &recv, sizeof(recv), 0,  //从客户端接受消息(struct sockaddr *)&client_address, //存储客户端地址信息(socklen_t *)&client_len)) == -1){    perror("recvfrom");exit(EXIT_FAILURE);}if(findclient(client_address, client, &client_num) == 0) {strcpy(send, "Welcome to chating room");if((byte = sendto(server_socketfd, &send, sizeof(send), 0, (struct sockaddr *)&client_address,(socklen_t)client_len)) == -1){perror("send");exit(EXIT_FAILURE);}} //给刚加入的客户端发送确认信息//printf("recv:%s\n", recv);//printf("send:");//scanf("%s", send);for(i = 0; i < client_num; i++){if(client[i].sin_port != client_address.sin_port) {client_len = sizeof(client[i]);if((byte = sendto(server_socketfd, &recv, sizeof(send), 0, (struct sockaddr *)&client[i],(socklen_t)client_len)) == -1){perror("send");exit(EXIT_FAILURE);}}}}//shutdown(client_socketfd, 2);//shutdown(server_socketfd, 2);return 0;}int findclient(struct sockaddr_in client_address, struct sockaddr_in client[], int *client_num){int i;if(client_num == 0) {//client[0].sin_family = client_address.sin_family;//client[0].sin_port = client_address.sin_port;client[0] = client_address;(*client_num)++;return 0; //没有客户端信息}else {for(i = 0; i < (*client_num); i++) {if(client[i].sin_port == client_address.sin_port)return 1; //列表中有客户端的信息}client[i] = client_address;(*client_num)++;return 0; //没有客户信息}}</span>


client程序:  多人通信的时候需要将client程序复制多份并,改变port值

/*  * File Name: socket_udp_server.c  * Author: eagle  * mail: zhaocheng121@163.com  * Created Time: 2015-10-08 18:43 */#include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <net/if.h>#include <unistd.h>#include <stdlib.h>#include <string.h>#include <sys/ioctl.h>int main(int argc, char *argv[]){int socketfd;int server_len,client_len;struct sockaddr_in server_address;struct sockaddr_in client_address;int i,byte;char recv[100], send[100];//char recv, send;/*hostip 本机ip地址*//*int inet_sock;struct ifreq ifr;char hostip[15];inet_sock = socket(AF_INET, SOCK_DGRAM,0);strcpy(ifr.ifr_name, "wlan0");if (ioctl(inet_sock, SIOCGIFADDR, &ifr) < 0)perror("ioctl");strcpy(hostip, inet_ntoa(((struct sockaddr_in *)&(ifr.ifr_addr))->sin_addr));*//*上面部分为获取本机ip*/socketfd = socket(AF_INET, SOCK_DGRAM, 0); //创建socket对象server_address.sin_family = AF_INET;              server_address.sin_addr.s_addr = inet_addr("127.0.0.1"); //主机ipserver_address.sin_port = 9734;                     //主机端口    server_len = sizeof(server_address);client_address.sin_family = AF_INET;              client_address.sin_addr.s_addr = inet_addr("127.0.0.1"); //主机ipclient_address.sin_port = <span style="color:#ff0000;">9735</span>;                     //主机端口client_len = sizeof(client_address);bind(socketfd, (struct sockaddr *) & client_address, client_len);while(1){printf("send:");scanf("%s", send);if((byte = sendto(socketfd, &send, sizeof(send), 0, (struct sockaddr *)&server_address,(socklen_t)server_len)) == -1){perror("send");exit(EXIT_FAILURE);}if((byte = recvfrom(socketfd, &recv, sizeof(recv), 0,  //从客户端接受消息(struct sockaddr *)&server_address, //存储客户端地址信息(socklen_t *)&server_len)) == -1){perror("recvprom");exit(EXIT_FAILURE);}printf("recv:%s\n", recv);}shutdown(socketfd, 2);return 0;}




0 0
原创粉丝点击