由于最近会研究socket编程,先编写了简单的客户端和服务器端,供以后使用时候不用再去重复造轮。
我习惯贴出代码,再进行分析。
client.c
1 #include <stdio.h> 2 #include <arpa/inet.h> 3 #include <stdlib.h> 4 #include <errno.h> 5 #include <string.h> 6 #include <sys/types.h> 7 #include <netinet/in.h> 8 #include <sys/socket.h> 9 #include <sys/wait.h> 10 11 #define SERVPORT 4567 12 #define MAXDATASIZE 100 13 #define SERVER_IP "127.0.0.1" 14 #define DATA "this is a client" 15 16 int main(int argc, char* argv[]) { 17 int sockfd, recvbytes; 18 char buf[MAXDATASIZE]; 19 struct hostent *host; 20 struct sockaddr_in serv_addr; 21 22 if (( sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { 23 perror("socket error!"); 24 exit(1); 25 } 26 27 bzero(&serv_addr,sizeof(serv_addr)); 28 serv_addr.sin_family = AF_INET; 29 serv_addr.sin_port = htons(SERVPORT); 30 serv_addr.sin_addr.s_addr= inet_addr(SERVER_IP); 31 32 if (connect(sockfd, (struct sockaddr *)&serv_addr,sizeof(struct sockaddr)) == -1) { 33 perror("connect error!"); 34 exit(1); 35 } 36 37 write(sockfd,DATA, sizeof(DATA)); 38 if ((recvbytes = recv(sockfd, buf, MAXDATASIZE,0)) == -1) { 39 perror("recv error!"); 40 exit(1); 41 } 42 43 buf[recvbytes] = ‘\0‘; 44 printf("Received: %s",buf); 45 close(sockfd); 46 return 0; 47 }
server.c
#include <stdio.h> #include <stdlib.h> #include <arpa/inet.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #include <sys/wait.h> #define SERVPORT 4567 #define BACKLOG 10 #define MAXSIZE 1024 int main() { int sockfd,client_fd; struct sockaddr_in my_addr; struct sockaddr_in remote_addr; //创建套接字 if ((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1) { perror("socket create failed!"); exit(1); } //绑定端口地址 my_addr.sin_family = AF_INET; my_addr.sin_port = htons(SERVPORT); my_addr.sin_addr.s_addr = INADDR_ANY; bzero(&(my_addr.sin_zero),8); if (bind(sockfd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr)) == -1) { perror("bind error!"); exit(1); } //监听端口 if (listen(sockfd, BACKLOG) == -1) { perror("listen error"); exit(1); } while (1) { int sin_size = sizeof(struct sockaddr_in); if ((client_fd = accept(sockfd, (struct sockaddr*)&remote_addr,&sin_size)) == -1) { perror("accept error!"); continue; } printf("Received a connection from %s\n", inet_ntoa(remote_addr.sin_addr)); //子进程段 if (!fork()) { //接受client发送的请示信息 int rval; char buf[MAXSIZE]; if ((rval = read(client_fd, buf, MAXSIZE)) < 0) { perror("reading stream error!"); continue; } printf("%s\n",buf); //向client发送信息 char* msg = "you have linked\n"; if (send(client_fd, msg, strlen(msg), 0) == -1) perror("send error!"); close(client_fd); exit(0); } close(client_fd); } return 0; }
1.编译这段程序时候遇到的问题。
(1).inet_ntoa()报错
.64未linux下,inet_ntoa()函数返回的是int,不是char *。
.解决方法:#include <arpa/inet.h>
linux c socket 编程,布布扣,bubuko.com
原文:http://www.cnblogs.com/xiongge/p/3579710.html