2015-01-17 13:40:24|?次阅读|上传:wustguangh【已有?条评论】发表评论
关键词:C/C++, 网络通信|来源:唯设编程网
#include <unistd.h>
ssize_t write (int fd, const void *buf, size_t count);
ssize_t read (int fd, void *buf, size_t count);
返回:成功则返回已经写入或读取的字节数,出错返回-1,由于size_t为非负数,而返回值可能会-1,所以返回值类型为ssize_t(也就是signed size_t)。
参数:fd代表socket,buf为内存指针,count表示读写内存的长度。
可以看到,使用write和read函数读写套接口的方法和读写文件的方法是一致的。
程序remote_read.c使用了read函数。程序中服务器监听一个端口,如果客户端请求连接这个端口,则服务器接受,并使用read函数从请求中读取客户端发来的信息,最后输出这些数据。这里的客户端请求仍然可以使用浏览器输入IP地址和端口的方法来进行。
remote_read.c代码如下:
#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <memory.h> #include <fcntl.h> #include <sys/stat.h> #define PORT 5566 int main() { int sockfd; struct sockaddr_in addr; if( (sockfd=socket(AF_INET,SOCK_STREAM,0)) < 0 ) { perror("socket create error!"); exit(1); } else { printf("socket create successfully! "); printf("socket id:%d ",sockfd); } bzero(&addr,sizeof(struct sockaddr_in)); addr.sin_family=AF_INET; addr.sin_port=htons(PORT); addr.sin_addr.s_addr=htonl(INADDR_ANY); if( bind(sockfd,(struct sockaddr*)(&addr),sizeof(struct sockaddr))<0 ) { perror("bind error!"); exit(1); } else { printf("bind port successfully! "); printf("local port:%d ",PORT); } const int max_connection = 5; if(listen(sockfd,max_connection)<0) { perror("listen error!"); exit(1); } else { printf("listenning.... "); } socklen_t addr_len = sizeof(struct sockaddr_in); char msgbuf[1024]; int newsockfd; if( (newsockfd = accept(sockfd,(struct sockaddr*)(&addr),&addr_len))<0 ) { perror("accept error!"); } else { printf("connect from %s ", inet_ntoa(addr.sin_addr)); if(read(newsockfd,msgbuf,sizeof(msgbuf))<=0) { perror("accept error!"); } else { printf("message: %s ",msgbuf); } } return 0; }
运行结果如下:
socket create successfully!
socket id:3
bind port successfully!
local port:5566
listenning....
浏览器地址栏输入:
http://127.0.0.1:5566/
结果如下:
connect from 127.0.0.1
message:
GET / HTTP/1.1
Host: 127.0.0.1:5566
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:11.0) Gecko/20100101 Firefox/11.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
可以看到,客户端从浏览器输入地址和端口后,服务器可以使用read函数接受请求信息,请求信息中包含了操作系统、浏览器、语言、编码等相关信息。