首页 / 操作系统 / Linux / Linux/Unix服务端和客户端Socket编程入门实例(含源码下载)
前言本章节是用基本的Linux/Unix基本函数编写一个完整的服务器和客户端例子,可在Linux(Ubuntu)和Unix(freebsd)上运行,客户端和服务端的功能如下:客户端从标准输入读入一行,发送到服务端服务端从网络读取一行,然后输出到客户端客户端收到服务端的响应,输出这一行到标准输出服务端代码如下:#include<unistd.h> #include<sys/types.h> /* basic system data types */ #include<sys/socket.h>/* basic socket definitions */ #include<netinet/in.h>/* sockaddr_in{} and other Internet defns */ #include<arpa/inet.h> /* inet(3) functions */ #include <stdlib.h> #include <errno.h> #include <stdio.h> #include <string.h> #define MAXLINE 1024 //typedef struct sockaddrSA; void handle(int connfd); intmain(int argc, char **argv) { int listenfd, connfd; intserverPort = 6888; int listenq = 1024; pid_t childpid; char buf[MAXLINE]; socklen_t socklen; struct sockaddr_in cliaddr, servaddr; socklen = sizeof(cliaddr); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(serverPort); listenfd = socket(AF_INET, SOCK_STREAM, 0); if (listenfd < 0) { perror("socket error"); return -1; } if (bind(listenfd, (struct sockaddr *) &servaddr, socklen) < 0) { perror("bind error"); return -1; } if (listen(listenfd, listenq) < 0) { perror("listen error"); return -1; } printf("echo server startup,listen on port:%d
", serverPort); for ( ; ; ){ connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &socklen); if (connfd < 0) { perror("accept error"); continue; } sprintf(buf, "accept form %s:%d
", inet_ntoa(cliaddr.sin_addr), cliaddr.sin_port); printf(buf,""); childpid = fork(); if (childpid == 0) { /* child process */ close(listenfd);/* close listening socket */ handle(connfd); /* process the request */ exit (0); } else if (childpid > 0){ close(connfd);/* parent closes connected socket */ } else { perror("fork error"); } } } void handle(int connfd) { size_t n; charbuf[MAXLINE]; for(;;) { n = read(connfd, buf, MAXLINE); if (n < 0) { if(errno != EINTR) { perror("read error"); break; } } if (n == 0) { //connfd is closed by client close(connfd); printf("client exit
"); break; } //client exit if (strncmp("exit", buf, 4) == 0) { close(connfd); printf("client exit
"); break; } write(connfd, buf, n); //write maybe fail,here don"t process failed error } }
收藏该网址