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函数接受请求信息,请求信息中包含了操作系统、浏览器、语言、编码等相关信息。