我正在处理一个简单的套接字服务器,该服务器应该接收多个连接并将它们移交给"连接"通过EndAccept()
的类问题是,在接受连接之后,代码在连接结束之前不会接受任何进一步的操作。
我在Main()
中创建套接字,然后通过Initialize()
将套接字传递给ServerEnvironment(静态类)。
MainSocket.Bind(new IPEndPoint(IPAddress.Parse(Addr), Port));
MainSocket.Listen(10);
ServerEnvironment.Initialize(MainSocket);
while (true)
{
Console.ReadLine();
Console.WriteLine(">>");
}
一旦MainSocket
通过,ServerEnvironment将从那里接管。
static Socket MainSocket;
public static void Initialize(Socket _MainSocket)
{
MainSocket = _MainSocket;
AcceptGameConnection = new AsyncCallback(AddConnection);
MainSocket.BeginAccept(AcceptGameConnection, null);
}
public static void AddConnection(IAsyncResult Result)
{
Socket UserSocket = MainSocket.EndAccept(Result);
ConnectionCount++;
// Removed the stuff that happens to UserSocket because the same
// symptoms occur regardless of their presence.
MainSocket.BeginAccept(AcceptGameConnection, null);
}
当我搜索这个问题时,我发现多线程可能是我的目的所必需的。但是,当我在Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
和Initialize();
中使用AddConnection();
时,会出现两个不同的线程ID,因此我假设多线程已经是一种功能,我不需要手动创建一个线程。但这并不能解释我的问题。
我是否需要多线程才能拥有并发和异步套接字连接?
编辑: 绑定错误..绑定到我的局域网地址,这导致了一些问题。
答案 0 :(得分:4)
如果您使用.net 4.0或更低版本
,这就是您要执行此操作的方式struct color_picker {
char const *name;
enum colors_t id;
} acolor[] = { {"blue", blue}, {"red", red}, {"green", green} };
const unsigned acolor_count = sizeof acolor / sizeof acolor[0];
int cmp_color(struct color_picker const *l, struct color_picker const *r)
{
return strcmp(l->name, r->name);
}
int main(int argc, char *argv[])
{
struct color_picker *ptr;
qsort(acolor, acolor_count, sizeof acolor[0], cmp_color);
ptr = bsearch(name, acolor, acolor_count, sizeof acolor[0], cmp_color);
if (NULL == ptr) {
printf("%s is not a usable color\n",argv[1]); }
}
/* the value for `enum color_t` is in `ptr->id` */
return 0;
}
但是你可以在.net 4.5或更高版本中使用它。
public static void Initialize(Socket _MainSocket)
{
MainSocket = _MainSocket;
AcceptGameConnection = new AsyncCallback(AddConnection);
MainSocket.BeginAccept(result => {
var userSocket = MainSocket.EndAccept(result);
var thread = new Thread(AddConnection);
thread.Start(userSocket);
Initialize(MainSocket);
}, null);
}
public static void AddConnection(IAsyncResult Result)
{
MainSocket.BeginAccept(AcceptGameConnection, null);
}
private static void AddConnection(Socket userSocket)
{
// Removed the stuff that happens to UserSocket because the same
// symptoms occur regardless of their presence.
}