版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zyq_hh/article/details/66019078
int socket(int domain,int type,int protocol);
domain参数指定协议族
type参数指定这个套接字的通信类型
protocol参数指定使用的协议
AF_UNIX UNIX域协议(文件系统套接字)
AF_INET ARPA因特网协议(UNIX网络套接字)
AF_ISO IOS标准协议
AF_NS 施乐(Xerox)网络系统协议
AF_IPX Novell IPX协议
AF_APPLETALK Appletalk DDS
最常用的就是AF_UNIX和AF_INET
扫描二维码关注公众号,回复:
4534360 查看本文章
AF_INET套接字可用于TCP/IP网络进行通信。
socket函数的参数type指定用于新套接字的通信特性、它的取值包括SOCK_STREAM和SOCK_DGRAM。
SOCK_STRERAM通常用在TCP连接,SOCK_DGRAM通常用于UDP数据报。
socket函数的参数protocol通常选择0,表示使用默认协议。
在AF_INET域中,套接字地址由结构sockaddr_in来指定,在netinet/in.h中
struct sockaddr_in{
short int sin_family;
unsigned short int sin_port;
struct in_addr sin_addr;
};
直接看代码吧:
有的时候客户端无法与服务端建立TCP连接,可能是服务端的防火墙没关,没有打开端口。
可以使用fork()函数创建字进程,这样改程序就能与多个客户端进行连接。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.h>
#define SERV_PORT 8000
#define SIZE 100
int main()
{
struct sockaddr_in servaddr,cliaddr;
socklen_t cliaddr_len;
int listenfd,connfd;
char buf[MAXLINE];
int i,n,flag = 0;
listenfd = socket(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY); //因为本机地址可以有很多种表示,htonl只是为了保险起见,可以去掉
servaddr.sin_port = htons(SERV_PORT);
bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr)); //端口绑定
listen(listenfd,20);//监听端口,20表示最大阻塞
printf("Accepting connections..\n");
while(1){
cliaddr_len = sizeof(cliaddr);
connfd = accept(listenfd,(struct sockaddr *)&cliaddr,&cliaddr_len); //如果得不到客户端发来的消息,将会被阻塞,一直等到消息到来
n = read(connfd,buf,MAXLINE); //如果n<=0,表示客户端已断开
while(1){
if(n!=0){
for(i = 0;i<n;i++)printf("%c",buf[i]); //输出客户端发来的信息
}
else{
printf("Client say close the connection..\n");
break;
}
n = read(connfd,buf,MAXLINE);
}
close(connfd);
}
}