日期:2014-05-16 浏览次数:20831 次
1、Linux下的Socket通信是一种基于文件的IPC通信,也可以是基于其他设备的IPC通信。它可以在本机内不同进程间实现通信,也可以在实现不同主机之间的通信。
2、Socket是一种进程间通信模式:
对等模式(P2P):一对一:UDP
客户服务器模式(C/S):一对多:TCP
3、基本创建步骤
(1)通过socket()函数创建socket
(2)通过bind函数绑定socket于设备地址
(3)进行读写操作read/recv/recvfrom write/send/sendto
(4)close方法关闭套接字
4、下面是其中用到的一些函数的用法及说明
(1)socket函数
int socket(int domain,int type, int protocol)
domain:地址族 IF_INET与底层内核通信(原生数据包)
type:通信的数据格式
protocol:传递数的含义
通信的数据类型:
SOCK_STREAM:字节流(一对多)
SOCK_DGRAM:字节包(一对一)
SOCK_RAW:硬件层的原生数据包?
通信的协议:
0:默认协议:地址族+数据格式=唯一决定协议
指定协议 IPPROTO_TCP
??????? IPPROTO_UDP
??????? IPPROTO_IP
??????? IPPROTO_ICMP
??????? IPPROTO_IGMP
(2)bind函数
把socket绑定到一个通信地址
int bind(int sockfd,const struct sockaddr* addr,socklen_t len)
sockfd:绑定地址的socket
addr:地址
len:地址内存长度
返回:成功是0,失败是-1
(3)recvfrom函数
如果想返回数据发送者的地址,则使用recvfrom.
int recvfrom(int fd,
?void *buf,
?size_t len,
?int flag,
?struct sockaddr*addr,//返回数据发送者的地址) ssocklen_t *l);//输入返回地址缓冲长度,返回实际发送者的地址长度
(4)write/send/sendto函数
int sendto(int fd,//发送socket
??? const void *buf,//发送的数据
??? size_t len,//发送数据的长度
??? int flag,//发送数据的方式,建议为0
??? const struct sockaddr *addr,//数据??????? 发往的目的地址
??? socklen_t l);//地址长度
? 返回:
??? -1:发送失败
??? 否则就是发送的字节数。
?
代码如下:
test1.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(void)
{
//create socket
int fd = socket(AF_INET, SOCK_DGRAM, 0);
if(fd==-1)
{
perror("socket\n");
exit(-1);
}
printf("socket fd=%d\n",fd);
//build connection address
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(6666);
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
int r;
r = bind(fd,(struct sockaddr*)&addr,sizeof(addr));
if(r==-1)
{
perror("bind");
close(fd);
exit(-1);
}
printf("bind address successful!\n");
//accept or send message
char buf[255];
struct sockaddr_in from;
socklen_t len;
len = sizeof(from);
while(1)
{
r = recvfrom(fd,buf,sizeof(buf)-1,0,(struct sockaddr*)&from,&len);
if(r>0)
{
buf[r]=0;
printf("The message from %s is:%s\n",inet_ntoa(from.sin_addr),buf);
}
else
{
break;
}
}
//close socket
close(fd);
return 0;
}
test2.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(void)
{
//create socket
int fd = socket(AF_INET,SOCK_DGRAM,0);
if(fd==-1)
{
perror("socket");
exit(-1);
}
printf("create socket OK!\n");
//create an send address
struct sockaddr_in addr={};
addr.sin_family = AF_INET;
addr.sin_port = htons(6666);
addr.sin_addr.s_addr=inet_addr("127.0.0.1");
//send the message to the specify address
int r;
char buf[255];
while(1)
{
r = read(0,buf,sizeof(buf)-1);
if(r<=0)
break;
sendto(fd,buf,r,0,(struct sockaddr*)&addr,sizeof(addr));
}
//close socket
close(fd);
return 0;
}
?运行结果如下:(先运行test1.o,然后运行test2.o,在test2.c运行后输入内容,在test1.c所在终端中就会显示信息)

?
以下是一些好的博客:http://blog.sina.com.cn/s/blog_48d101870100n7e9.html