1、Linux/Unix Socket 函数库
Linux Socket 函数库是从Berkeley大学开发的BSD Linux系统中移植过来的。BSD Socket 接口在众多Unix系统中
被广泛支持的TCP/IP通信接口,Linux下的Socket程序设计也适用于大多数其他的Unix系统。
2、Socket编程原理
套接口网络编程原理
套接口有三种类型:流式套接口、数据报套接口以及原始套接口。
流式套接口定义了一种可靠的面向连接的服务,实现了无差错无重复的顺序数据传输。
数据报套接口定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且
不保证可靠,无差错。原始接口允许对底层协议如IP或者ICMP直接访问,主要用于新的网络协
议实现测试等。
无连接服务器一般都是面向事物处理,一个请求与一个应答就完成了客户程序与服务程
序之间的相互作用。使用无连接的套接口编程,程序的流程可以用如下表示。
面向连接的服务器处理请求比较复杂,使用面向连接的套接口编程,流程如下表示
套接口工作过程如下:启动服务器,通过调用socket()建立一个套接口,然后调用
bind()将该套接口和本地网络地址联系在一起,再调用listen()使套接口做好侦听准备,并规定
他的请求对垒的长度,之后就调用accept()来接收连接。客户在建立套接口后就可以调用connect()
和服务器建立连接。连接一旦建立,客户端和服务器之间就可以通过read()和write()来发送和
接收数据。最后,带数据传送结束后,双方调用close()关闭套接口。
3、客户端例程
#include
#include
#include
#include
#define PORT 12345
#define HOST_ADDR "192.168.47.187"
void main()
{
struct sockaddr_in server;
int s, ns;
int pktlen, buflen;
char buf1[256], buf2[256];
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
server.sin_family = AF_INET;
server.sin_port = htons(PORT);
server.sin_addr.s_addr = inet_addr(HOST_ADDR);
if(connect(s, (struct sockaddr *)&server, sizeof(server)) < 0)
{
perror("connect()");
return;
}
while(1)
{
printf("Input send data:");
gets(buf1);
buflen = strlen(buf1);
if(buflen == 0)
{
break;
}
send(s, buf1, buflen+1, 0);
}
close(s);
}
4、服务端例程
#include
#include
#include
#define PORT 12345
void main()
{
struct sockaddr_in client, server;
int s, ns, namelen, pktlen;
char buf[256];
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
memset(&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(PORT);
server.sin_addr.s_addr = INADDR_ANY;
bind(s, (struct sockaddr *)&server, sizeof(server));
listen(s, 1);
namelen = sizeof(client);
ns = accept(s, (struct sockaddr *)&client, &namelen);
while(1)
{
pktlen = read(ns, buf, sizeof(buf), 0);
if(pktlen == 0)
break;
printf("Receive tcp data: %s \n", buf);
write(ns, buf, pktlen, 0);
memset(buf, 0, sizeof(buf));
}
printf("close tcp link %d\n", ns);
close(ns);
close(s);
}