Linux C监听端口

来源:互联网 发布:阿里云服务器宕机 编辑:程序博客网 时间:2024/06/11 20:34
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

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);    }}
                                             
0 0
原创粉丝点击