Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用套接字c将多个程序连接到一台服务器_C_Sockets - Fatal编程技术网

使用套接字c将多个程序连接到一台服务器

使用套接字c将多个程序连接到一台服务器,c,sockets,C,Sockets,我需要一个服务器和一个客户端来进行简单的聊天。服务器必须有线程来监听所有客户端,并且必须向每个人发送接收到的消息。服务器必须有2个线程,以保持侦听套接字以获取新消息,并从键盘读取消息并将其发送到服务器。我的问题是:如何与服务器建立多个连接?我在考虑使用多个套接字,每个客户端一个,客户端会尝试连接每个端口,直到某些端口工作,但如果套接字在我所说的端口中已经有连接,则不会给出错误。有人有什么建议吗?我需要使用TCP 编辑:我的问题不在服务器上,我的问题在客户端。我所做的(或尝试的,至少,我不确定它是

我需要一个服务器和一个客户端来进行简单的聊天。服务器必须有线程来监听所有客户端,并且必须向每个人发送接收到的消息。服务器必须有2个线程,以保持侦听套接字以获取新消息,并从键盘读取消息并将其发送到服务器。我的问题是:如何与服务器建立多个连接?我在考虑使用多个套接字,每个客户端一个,客户端会尝试连接每个端口,直到某些端口工作,但如果套接字在我所说的端口中已经有连接,则不会给出错误。有人有什么建议吗?我需要使用TCP

编辑:我的问题不在服务器上,我的问题在客户端。我所做的(或尝试的,至少,我不确定它是否正确)是让服务器中的main创建一个线程来侦听套接字。当存在连接时,该线程负责该套接字,主线程创建另一个线程负责其他端口的其他套接字。问题是:如何在客户端检测到某个端口已在使用,并且需要连接到下一个端口的套接字

很抱歉英语不好。

客户端 从内存工作,对于TCP套接字,客户端只需使用和 ,指定服务器IP地址和端口号。
connect()
自动为您分配一个本地端口;你不必做任何特别的事

服务器端 这个问题的第一版似乎在讨论服务器端问题

当服务器运行时,它使用已知的套接字(具有已知的端口号)。然后它进入一个与服务器阻塞的循环,在该循环上为新的传入连接创建一个新的套接字文件描述符,与侦听套接字文件描述符分离

Server

socket()
   |
bind()
   |
listen()
   |
   +<----+
   |     |
accept() |
   |     |
process  |
   |     |
   +-----+
服务器
套接字()
|
绑定()
|
听
|

+ 如果您想编写一个线程化TCP服务器,标准的方法是两个线程,它们侦听连接并接受客户端,然后为每个接受的客户端启动一个新线程。你可以在网上找到多个例子,一些快速的谷歌搜索告诉我:

“当系统检测到一个新连接时,
listen()
returns”不是真的<代码>侦听()
不是阻塞函数。一旦套接字进入侦听状态,它总是立即返回。它是
accept()
,如果在阻塞模式(默认设置)下使用,则在新客户端连接之前不会返回。如果您在非阻塞模式下使用它,那么它总是立即返回,让您知道新客户端是否已连接,或者等待是否会阻塞并需要再次调用。“哪个具有唯一的临时端口号”也是不正确的。服务器端接受的客户端套接字使用服务器的侦听IP/端口和客户端的出站IP/端口。客户端端口在客户端可能是短暂的,但在服务器端肯定不是?我做错了什么?欢迎来到堆栈溢出。请尽快阅读这篇文章。否决这项决议的原因可能是“以前有人问过”和“可以在网上轻松搜索到”。有些人对这样的问题比其他人更不耐烦。我在网上和这里搜索了我的问题,但找不到任何对我有帮助的东西。