C/C++编程之socket基本函数的用法

2015-01-17 13:40:24|?次阅读|上传:wustguangh【已有?条评论】发表评论

关键词:C/C++, 网络通信|来源:唯设编程网

8.write和read函数

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

发表评论0条 】
网友评论(共?条评论)..
C/C++编程之socket基本函数的用法