TCP/IP 第2章 套接字类型与协议设置

创建套接字:

int socket(int domain, int type, int protocol);

成功时返回文件描述符,失败时返回-1。

domain:套接字中使用的协议族(protocol family)信息。

type:套接字数据传输类型信息。

protocol:计算机间通信中使用的协议信息。

 

Protocol Family: 

头文件sys/socket.h中声明的协议族
名称协议族
PF_INETIPv4

PF_INET6

IPv6
PF_LOCAL本地通信的UNIX协议族
PF_PACKET底层套接字的协议族
PF_IPXIPX Novell协议族

主要用PF_INET协议族。

 

Type:

套接字类型指的是套接字的数据传输方式,通过第二个参数传递。协议族中存在着多种数据传输方式。

SOCK_STREAM:面向连接的套接字

  • 传输过程中数据不会消失
  • 按序传输数据
  • 传输的数据不存在数据边界

收发数据的套接字内部有buffer(缓冲区)。所以可以n对m的进行read()和write()。

当buffer满了之后,传输端套接字将停止传输。

“可靠的、按序传递的、基于字节的面向连接的数据传输方式的套接字”

 

SOCK_DGRAM:面向消息的套接字

  • 强调快速传输而非传输顺序
  • 传输的数据可能丢失也可能损毁
  • 传输的数据有数据边界
  • 限制每次传输的数据大小

“不可靠的、不按序传递的、以数据的高速传输为目的的套接字”

 

第三个参数:

在大部分情况侠,传递前两个参数即可创建所需的套接字。所以可以向第三个参数传递0。

但是会遇到,同一协议族中存在多个数据传输方式相同的协议。

 

在基于IPv4网络协议族中:

SOCK_STREAM只有IPPROTO_TCP。 

SOCK_DGRAM只有IPPROTO_UDP。

 

多次read实例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

void error_handling(char *message);


int main(int argc, const char * argv[])
{
	int sock;
	struct sockaddr_in serv_addr;
	char message[30];
	int str_len;
	if(argc!=3){
		printf("Usage : %s <IP> <port>\n",argv[0]);
		exit(1);
	}

	sock = socket(PF_INET, SOCK_STREAM, 0);
	if(sock == -1)
		error_handling("socket() error");

	memset(&serv_addr, 0, sizeof(serv_addr));
	serv_addr.sin_family=AF_INET;
	serv_addr.sin_addr.s_addr=inet_addr(argv[1]);
	serv_addr.sin_port=htons(atoi(argv[2]));

	if(connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr))==-1)
		error_handling("connect() error!");
	int idx=0,read_len=0;
	while(read_len=read(sock, &message[idx++],1)){
		if(read_len==-1)
			error_handling("read() error!");
		str_len+=read_len;
	}
	if(str_len==-1)
		error_handling("read() erroe!");
	printf("Message from server : %s\n",message);
	printf("use read() %d times",idx);
	close(sock);

	return 0;
}


void error_handling(char* s)
{
	fputs(s, stderr);
	fputc('\n', stderr);
	exit(1);
}


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值