socket通信可以直接传送结构体!
示例:
(发送端)
- struct student
- {
- char name[20];
- int age;
- };
- struct student student1={"liuxiaobing",23};
接受端:
- struct student
- {
- char name[20];
- int age;
- };
- struct student *student_client = NULL;
- while(1)
- {
- n = read(sockfd, recvline, MAXLINE);
- if(n == -1)
- {
- perror("read error");
- exit(1);
- }
- student_client = (struct student *)recvline;
- //recvline[n] = 0;
- printf("Receive:name=%s***age=%d/n",student_client->name,student_client->age);
- //fputs(recvline, stdout);
- //printf("%s/n",recvline);
- }
UDPsocket通信简单的代码:
udpserv.c
- /*udpserv.c*/
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #define MAXLINE 100
- #define SERV_PORT 8888
- int sockfd;
- struct sockaddr_in servaddr, cliaddr;
- socklen_t len;
- struct student
- {
- char name[20];
- int age;
- };
- struct student student1={"liuxiaobing",23};
- void get_msg()
- {
- int n;
- //socklen_t len;
- char mesg[MAXLINE];
- while(1)
- {
- memset(mesg,0,MAXLINE);
- len = sizeof(cliaddr)+1;
- // waiting for receive data
- n = recvfrom(sockfd, mesg, MAXLINE, 0, (struct sockaddr *)&cliaddr, &len);
- printf("对方:%s/n",mesg);
- //printf("n = %d/n",n);
- // sent data back to client
- //sendto(sockfd, mesg, n, 0, (struct sockaddr *)&cliaddr, len);
- }
- }
- void send_msg()
- {
- int n;
- char sendline[MAXLINE];
- //while(fgets(sendline, MAXLINE, stdin) != NULL)
- while(1)
- {
- //printf("%s/n",sendline);
- n = strlen(sendline);
- //printf("n=%d/n",n);
- sendto(sockfd, (void *)&student1, sizeof(student1), 0,
- (struct sockaddr *)&cliaddr, len);
- sleep(1);
- }
- }
- int main(void)
- {
- pthread_t threadin,threadout;
- void *retval;
- printf("%s/n%d/n",www.nigeriaembassy.cn,student1.age);
- sockfd = socket(AF_INET, SOCK_DGRAM, 0); /* create a socket */
- /* init servaddr */
- bzero(&servaddr, sizeof(servaddr));
- servaddr.sin_family = AF_INET;
- servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
- servaddr.sin_port = htons(SERV_PORT);
- /* bind address and port to socket */
- if(bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1)
- {
- perror("bind error");
- exit(1);
- }
- //do_echo(sockfd, (struct sockaddr *)&cliaddr, sizeof(cliaddr));
- pthread_create(&threadin,NULL,(void *)(&get_msg),NULL);
- pthread_create(&threadout,NULL,(void *)(&send_msg),NULL);
- pthread_join(threadin,&retval);
- pthread_join(threadout,&retval);
- return 0;
- }
udpclient.c
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #define MAXLINE 80
- #define SERV_PORT 8888
- int sockfd;
- struct sockaddr_in servaddr;
- struct student
- {
- char name[20];
- int age;
- };
- void get_msg()
- {
- int n;
- char sendline[MAXLINE], recvline[MAXLINE + 1];
- struct student *student_client = NULL;
- socklen_t servlen;
- servlen = sizeof(servaddr)+1;
- if(connect(sockfd, (struct sockaddr *)&servaddr, servlen) == -1)
- {
- perror("connect error");
- exit(1);
- }
- while(1)
- {
- n = read(sockfd, recvline, MAXLINE);
- if(n == -1)
- {
- perror("read error");
- exit(1);
- }
- student_client = (struct student *)recvline;
- //recvline[n] = 0;
- printf("Receive:name=%s***age=%d/n",student_client->name,student_client->age);
- //fputs(recvline, stdout);
- //printf("%s/n",recvline);
- }
- }
- void send_msg()
- {
- char sendline[MAXLINE];
- while(fgets(sendline, MAXLINE, stdin) != NULL)
- {
- write(sockfd, sendline, strlen(sendline));
- }
- }
- int main(int argc, char **argv)
- {
- pthread_t threadin,threadout;
- void *retval;
- /* check args */
- if(argc != 2)
- {
- printf("usage: udpclient
/n" ); - exit(1);
- }
- /* init servaddr */
- bzero(&servaddr, sizeof(servaddr));
- servaddr.sin_family = AF_INET;
- servaddr.sin_port = htons(SERV_PORT);
- /*用inet_pton判断输入的ip(存在argv[1]中)是否合法,并转化格式*/
- if(inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
- {
- printf("[%s] is not a valid IPaddress/n", argv[1]);
- exit(1);
- }
- sockfd = socket(AF_INET, SOCK_DGRAM, 0);/*create a socket*/
- //do_cli(stdin, sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
- pthread_create(&threadin,NULL,(void *)(&get_msg),NULL);
- pthread_create(&threadout,NULL,(void *)(&send_msg),NULL);
- pthread_join(threadin,&retval);
- pthread_join(threadout,&retval);
- return 0;
- }
分别编译:
gcc -lpthread -o udpserv udpserv.c
gcc -lpthread -o udpclient udpclient.c
[ 由于pthread库不是Linux系统默认的库,连接时需要使用库libpthread.a,所以在使用pthread_create创建线程时,在编译中要 加-lpthread参数:
gcc -o pthread pthread.c -lpthread
需要将链接库 -lpthread放在最后面
]
服务端(ip:10.10.19.225)运行:
#./udpserv
客户端运行:
#./udpclient 10.10.19.225
hello(输入hello回车)
观察两端效果.
由于UDP是不可靠的,非连接通信,所以要先从客户端发消息。