参考书目: 《实战Linux Socket 编程》 Warren W.Gay 著 詹俊鹄 于卫 译 西安电子科技大学出版社
UNIX 网络编程 第一卷:套接口API (3rd) BILL FENNER 等著 杨继张译 清华大学出版社
Linux中的套接口于电话相似。套接字代表通信线路中的端点,端点之间就是数据通信网络。套接口于电话的相似行还体现在,当你给某人打电话时,拨叫的是对方的电话号码。套接字中的网络地址相当于电话号码。通过指定远程套接口的地址,就可以建立从本地到远程的套接口的通信。
*创建套接口
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
int
main(void)
{
int z;/* 返回状态码*/
int s[2]; /* 套接口对 */
/*
* 生成本地套接口对
*/
z = socketpair (AF_LOCAL, SOCK_STREAM, 0, s);
if (z == -1){
fprintf(stderr, "%s:socketpair", strerror(errno));
return 1;/* 失败 */
}
/*打印返回的套接口描述符 */
printf("s[0] = %d; /n", s[0]);
printf("s[1] = %d: /n", s[1]);
system("netstat -p | more ");
return 0;
}
*用套接口实现 I/O
我们可以像读写一个已经打开的文件一样读写套接口。
用到的函数:
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd,const void *buf, size_t count);
int close(int fd);
//例子
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
int
main(void)
{
int z;/* 返回状态码*/
int s[2]; /* 套接口对 */
char* cp = NULL; /* 工作指针*/
char buf[80]; /* 接收缓冲区 */
/*
* 生成本地套接口对
*/
z = socketpair (AF_LOCAL, SOCK_STREAM, 0, s);
if (z == -1){
fprintf(stderr, "%s:socketpair", strerror(errno));
return 1;/* 失败 */
}
/*打印返回的套接口描述符 */
//printf("s[0] = %d; /n", s[0]);
//printf("s[1] = %d: /n", s[1]);
//system("netstat -p | more ");
/* 向套接口 s[1] 写入消息 */
z = write(s[1], cp="你好!",sizeof(cp));
if (z < 0){
fprintf(stderr, "s[1] write error :%d", strerror(errno));
return -1;
}
printf ("Wrote message /'%s/' on s[1]/n", cp);
/* 从套接口s[0]读取消息 */
z = read(s[0], buf, sizeof(buf));
if (z<0){
fprintf(stderr, "read s[0] error: %s", strerror(errno));
return -2;
}
buf[z] = 0;/*NULL 终止符*/
printf("/tReceived message :%s from socket s[0]. /n");
/* 从 s[0] 向 s[1] 发送消息 */
z = write(s[0], cp="不好!", sizeof(cp));
if (z < 0){
fprintf(stderr, "write s[0] error: %s",strerror(errno));
return -3;
}
printf("s[1] wote message: %s on s[0] /n", cp);
/* 从套接口 s[1] 读出应答消息 */
z = read(s[1], buf, sizeof(buf));
buf[z] = 0;/* NULL 终结符*/
if (z < 0 ){
fprintf(stderr, " read s[1] error: %s/n", strerror(errno));
return -4;
}
/* 报告s[0] 从 s[1] 中读出的消息 */
printf("/t s[0] received message %s from socket s[1]/n", buf);
/* 关闭套接口 */
close(s[0]);
close(s[1]);
printf("Done./n");
return 0;
}