一、一个简单的时间获取客户端
#include <sys/socket.h> #define MAXCON 50 #define MAXLINE 1024 #define PORT 13 void err_sys(const char* s) { fprintf(stderr, "%s\n",s); exit(1); } int main(int argc, char** argv) { int sockfd; structsockaddr_in servaddr; char buff[MAXLINE+1]; if(argc!=2) err_sys("inputerror"); if((sockfd=sock(AF_INET,SOCK_STREAM, 0))<0) err_sys("socketerror"); servaddr.sin_fimly=AF_INET; servaddr.sin_port=htons(PORT); if(inet_pton(AF_INET,argv[1], &servaddr.sin_addr)<=0) err_sys("ipaddress error"); if(connect(sockfd,(struct sockaddr *)servaddr, sizeof(servaddr))<0) err_sys("connecterror"); int nbyte; while((nbyte=read(sockfd,buff, MAXLINE))<0) { buff[nbyte]=0; if(fputs(buff,stdout)==EOF) err_sys("fputserror"); } if(n<0) err_sys("readerror"); exit(0); }
1. read返回0,表示客户端正常关闭连接。
read返回负值,表示连接发生错误。
2. 此时我们把read写在while循环内,因为我们无法确定服务器端传过来的数据多大,如果一次读不完,就需要多次读取。
3. Unix终止进程运行,总是关闭该进程打开的所有描述符。
4. 一个Unix函数中有错误发生,全局变量errno就会被置为一个指明该错误类型的正值。这些正值对于的枚举名通常在<sys/errno.h>中定义。值0不表示任何错误。
注意:这里说的Unix函数说的是Unix自身库的函数,不是用户自定义的函数。
注意:线程函数在发送错误时,不设置全局变量errno,而是把errno的值作为函数返回值返回给调用者。
5. 注意这里的servaddr表明的是服务端的地址。
二、 一个简单的时间获取服务端
#include <sys/socket.h> #define MAXLINE 1024 #define PORT 13 #define CONMAX 5 void err_sys(const char* s) { fprintf(stderr, "%s\n",s); exit(1); } int main(int argc, char** argv) { intlistenfd, connfd; structsockaddr_in servaddr; charbuff[MAXLINE+1]; listenfd=socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family=AF_INET; servaddr.port=htona(PORT); servaddr.sin_addr.s_addr=htonl(INADDR_ANY); bind(listenfd,(structsockaddr*) &servaddr, sizeof(servaddr)); listen(listenfd, CONMAX); while(true) { connfd=accept(listenfd, (struct sockaddr*) NULL, NULL); write(connfd, buff, strlen(buff)); close(connfd); } } // socket bind listen connect accept 涉及socket的这些函数正常情况下都返回一个正值,在错误情况下都返回一直负值。 //这里就不做错误检查了。
1. 注意这里是单线程,单进程。一次只能处理一个客户。如果有两个客户几乎同时到达,则系统在最大数目(CONMAX)的限制下,把它们排入队列中。
时间: 2024-10-17 03:13:31