Linux C监听端口

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);
    }
}

下面是一个简单的 Linux C 语言 socket 服务端循环监听端口的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #define PORT 8888 // 监听端口号 int main() { int sockfd, connfd; struct sockaddr_in servaddr, cliaddr; socklen_t len = sizeof(cliaddr); char buffer[1024]; // 创建 socket 文件描述符 sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == -1) { perror("socket"); exit(EXIT_FAILURE); } // 初始化服务器 socket 地址 memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; // 协议族 servaddr.sin_addr.s_addr = htonl(INADDR_ANY); // INADDR_ANY 表示任意地址 servaddr.sin_port = htons(PORT); // 端口号 // 绑定 socket 文件描述符和服务器 socket 地址 if (bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1) { perror("bind"); exit(EXIT_FAILURE); } // 开始监听连接请求 if (listen(sockfd, 5) == -1) { perror("listen"); exit(EXIT_FAILURE); } printf("Server listening on port %d...\n", PORT); while (1) { // 接受客户端连接请求 connfd = accept(sockfd, (struct sockaddr *)&cliaddr, &len); if (connfd == -1) { perror("accept"); continue; } printf("Accepted new connection from %s:%d\n", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port)); // 读取客户端发来的数据 read(connfd, buffer, sizeof(buffer)); printf("Received message: %s\n", buffer); // 回复客户端 write(connfd, "Hello, client!", strlen("Hello, client!")); // 关闭客户端连接 close(connfd); } // 关闭服务器 socket close(sockfd); return 0; } ``` 这段代码创建了一个 TCP socket 文件描述符,通过 `bind()` 函数将其绑定到指定的端口号,然后通过 `listen()` 函数开始监听连接请求。在 `while` 循环中,通过 `accept()` 函数等待客户端连接请求,并在连接建立后读取客户端发送的数据并回复。循环不断接受新的连接请求,直到服务器关闭。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值