创建套接字的各函数详解

1. socket函数:创建套接字

int sockfd;
if(sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
    printf("socket error");
}

/*
socket函数创建一个网际(AF_INET)字节流(SOCK_STREAM)套接字,它是TCP套接字的花哨名字。
该函数返回一个小整数描述符,以后所有的函数调用就用该描述符来标识这个套接字。
*/

2. 指定服务器的IP地址和端口号

struct sokaddr_in servaddr;
bzero(&servaddr, sizeof(servaddr));//或者用 memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(10000);
if(inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr)) < 0 )//或者用 servaddr.sin_addr = inet_addr("127.0.0.1");
{
    printf("inet_pton error for %s", "127.0.0.1");
}
/*
我们把服务器的IP地址和端口号填入一个网际套接字地址结构(一个名为servaddr的sockaddr_in结构变量)中。
使用bzero把整个结构清零后,置地址族为AF_INET,端口号为10000。
网际套接字结构地址中IP地址和端口号这两个成员必须使用特定格式,为此我们调用库函数:
htons:(“主机到短整数”)去转换二进制端口
inet_pton:(“呈现形式到数值”)将“点分十进制”转换成 “二进制整数”,inet_pton 是inet_addr的扩展,它是一个支持IPV6的新函数。
*/

3. 建立与服务器的连接

if(connect(sockfd, (struct sockaddr*)&addrserv, sizeof(servaddr)) > 0)
{
    printf("connect error");
}

/*
connect函数应用于一个TCP套接字时,将与由它的第二个参数指向的套接字地址结构指定的服务器建立一个TCP连接,该套接字地址结构的长度也必须作为该函数的第三个参数指定。
*/

4. 读取并输出服务器的应答

int n;
char recvline[1024+1];
while((n = read(sockfd, recvline, 1024)) > 0)
{
    recvline[n] = 0;
    if(fputs(recvline, stdout) == EOF)
    {
        printf("fputs error");
    }
}
if(n < 0)
{
    printf("read error");
}

/*
我们使用read函数读取服务器的应答,并用标准的I/O函数fputs输出结果。
使用TCP时必须小心,因为TCP是一个没有记录边界的字节流协议,假设我们有26个字节需要返回,这个26个字节有多种返回方式:
既可以是包含所有26个字节的单个TCP分节,也可以是每个分节只包含一个字节的26个TCP分节,还可以是总共包含26个字节的任何其他组合。
通常服务器返回包含所有26个字节的单个分节,但是如果数据量很大,我们就不保证一次read调用能够返回服务器的整个应答。
因此,从TCP套接字读取数据时,我们总是要把read编写在循环中,当read返回0(表示对端关闭连接)或负值(表示反生错误)时终止循环。
*/

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值