运行环境:centos 6.3
说明 :UNIX 网络编程测试代码
将客户端、服务端、以及广播消息的服务端都集成一段代码里面,个人感觉还不错呵呵呵
里面的注释不多,但是应该不难读懂的,还算比较容易
可以把一面代码直接贴下来,用gcc 编译跑一下,会发现在效果还不错
#include <stdio.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <netinet/in.h> #include <string.h> #include <errno.h> #include <stdlib.h> #include <arpa/inet.h> #include <unistd.h> typedef struct sockaddr_in sockaddr_in; typedef struct sockaddr sockaddr; int main(int argc, char ** argv) { sockaddr_in srv, cli; int fd, sfd, is_server; if (argc < 3) { printf( "please put the arguments ,like ./a.out addr_ip addr_port [server/client/broad]"); return -1; } if (argc >= 4) { if (strcmp("server", argv[3]) == 0) { is_server = 1; printf("i am server \n"); } else if (strcmp("client", argv[3]) == 0) { is_server = 0; printf("i am client \n"); } else if(strcmp("broad",argv[3]) == 0){ is_server = 2; printf("i want broad msg ,broad ip:X.X.X.255 \n"); } else { printf("arguments error\n"); return -1; } } else {//default is_server = -1 ; printf("i could recv and send msg ,muti process\n"); } memset(&srv, 0, sizeof(srv)); srv.sin_port = htons(atoi(argv[2])); srv.sin_family = AF_INET; if ((sfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("server socket error"); } if(is_server != -1){ fd = 1-is_server ; }else{ fd = fork(); if (fd < 0) { perror("fork error"); return -1; } } if (0 == fd) { //service is_server == 1 char recvbuf[1024]; char ip[50]; socklen_t len; int rnu = 0; srv.sin_addr.s_addr = INADDR_ANY ; int bfd; if ((bfd = bind(sfd, (sockaddr*) &srv, sizeof(sockaddr))) < 0) { perror("bind error"); } while (1) { memset(recvbuf, 0, sizeof(recvbuf)); len = sizeof(sockaddr); if((rnu = recvfrom(sfd, recvbuf, sizeof(recvbuf), 0, (sockaddr*) &cli,&len))<0) { printf("recvfrom error"); } else { printf("from:%s,recv:%s",inet_ntop(AF_INET, &cli.sin_addr, ip, sizeof(ip)), recvbuf); if (is_server!=-1 && sendto(sfd, recvbuf, strlen(recvbuf), 0, (sockaddr*) &srv, len) < 0) { perror("sendto error"); } //printf("send:%s\n", inet_ntop(AF_INET, &srv.sin_addr, ip, sizeof(ip))); sleep(2); } } close(sfd); }else if(-1 == fd){//broadcast char recvbuf[1024]; char ip[50]; socklen_t len; int rnu = 0; srv.sin_addr.s_addr = INADDR_ANY ; int bfd; if ((bfd = bind(sfd, (sockaddr*) &srv, sizeof(sockaddr))) < 0) { perror("bind error"); } while (1) { memset(recvbuf, 0, sizeof(recvbuf)); len = sizeof(sockaddr); int on_broadcast = 1; int rs = setsockopt(sfd, SOL_SOCKET, SO_BROADCAST, &on_broadcast, sizeof(on_broadcast)); if ((rs = inet_pton(AF_INET, "10.33.28.255", &srv.sin_addr)) <= 0) { perror("inet_pton error:"); } strcpy(recvbuf, "this is broad\n"); if (sendto(sfd, recvbuf, strlen(recvbuf), 0, (sockaddr*) &srv, len) < 0) { perror("sendto error"); } printf("send:%s\n", inet_ntop(AF_INET, &srv.sin_addr, ip, sizeof(ip))); sleep(2); } close(sfd); }else { char sendbuf[1024], *p = sendbuf; ssize_t bs; char ip[50]; socklen_t len = sizeof(sockaddr); inet_aton(argv[1], &srv.sin_addr); while (1) { memset(sendbuf, 0, sizeof(sendbuf)); bs = sizeof(sendbuf); bs = getline(&p, &bs, stdin); bs = sendto(sfd, sendbuf, bs, 0, (sockaddr*) &srv, len); printf("sendto:%s", sendbuf); if(is_server!=-1 && (bs = recvfrom(sfd, sendbuf, sizeof(sendbuf), 0, (sockaddr*) &cli,&len))>0){ printf("from:%s,recv:%s",inet_ntop(AF_INET, &cli.sin_addr, ip, sizeof(ip)),sendbuf); } } close(sfd); } }