程序演示了一个通过tcp/ip通讯的server/client程序,都是简单的C程序。源码:
server.c
#include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <sys/types.h> #include <errno.h> #include<string.h> int readline(int fd, void *pbuf, int maxlen); int main(int argc,char **argv) { int fd,client_sockfd; int len; int ret; struct sockaddr_in remoteaddr; struct sockaddr_in localaddr; char buf[1024]; // // 建立套接口 // fd = socket(AF_INET, SOCK_STREAM, 0); if(fd == -1) { printf("socket() error %d\n",errno); return -1; } // // 绑定地址和端口 // localaddr.sin_family = AF_INET; localaddr.sin_addr.s_addr = htonl(INADDR_ANY); localaddr.sin_port = htons(5000); len = sizeof(localaddr); if(bind(fd, (struct sockaddr *)&localaddr, len) == -1) { printf("bind() error\n"); return -1; } // // 建立套接口队列 // if(listen(fd, 5) == -1) { printf("listen() error\n"); return -1; } // // 等待 // len = sizeof(remoteaddr); printf("server recieve connect!--\n"); int i = 0; while(1) { printf("\nWaiting for ...\n"); // fflush(stdout); client_sockfd = accept(fd,(struct sockaddr *)&remoteaddr, &len); // // 接收数据 // ret = recv(client_sockfd, (void *)buf, 1024, 0); if(ret <= 0) { printf("server recieve data failed!--\n"); } else { printf("server read line:%s\n", buf); } memset(buf,0x00,sizeof(buf)); // strcpy(buf,"How are you?"); sprintf(buf, "%d: How are you?", ++i); sleep(3); ret = send(client_sockfd, (void *)buf, strlen(buf),0); if(ret <= 0) { printf("server send() error\n"); } memset(buf,0x00,sizeof(buf)); //关闭联接 close(client_sockfd); printf("close client\n"); } return 0; }
client.c
#include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <sys/types.h> #include <errno.h> #include <string.h> #include <stdlib.h> int main(int argc,char **argv) { int fd; int len,ret; struct sockaddr_in remoteaddr; char data[1024]; int times = 1; // // 建立套接口 // fd = socket(AF_INET, SOCK_STREAM, 0); // // 连接 // remoteaddr.sin_family = AF_INET; remoteaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); remoteaddr.sin_port = htons(5000); len = sizeof(remoteaddr); ret = connect(fd, (struct sockaddr *)&remoteaddr, len); if(ret == -1) { printf("connect() error\n"); return -1; } //while(1) { //发送数据 printf("The %d times run\n", times++); sprintf(data,"%s","hello world"); ret = send(fd, (void *)data, strlen(data),0); if(ret <= 0) { printf("send() error\n"); } printf("sent line:%s\n", data); bzero(data,1024); sleep(1); ret = recv(fd, (void *)data, 1024, 0); if(ret <= 0) { printf("server recieve data failed!--\n"); } else { int id = atoi(data); printf("client[id=%d] read str:[%s]\n", id, data); } } printf("client exited.\n"); // // 关闭 // finish: close(fd); fd = -1; return 0; }
再挂上我的Makefile:
install: myserver myclient myserver: server.o gcc -o myserver server.o #server.o: server.c myclient: client.o gcc -o myclient client.o #client.o: client.c clean: rm -f *.o my*
挂上我的这个makefile,主要是为了说明:
1. 我这个文件相互之间没有依赖性。
2. server.o依赖于server.c,所以这个依赖规则在makefile文件中可以不写,它默认已经存在的。