C#并发和异步套接字连接

时间:2015-08-22 20:14:27

标签: c# multithreading sockets asynchronous

我正在处理一个简单的套接字服务器,该服务器应该接收多个连接并将它们移交给"连接"通过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,因此我假设多线程已经是一种功能,我不需要手动创建一个线程。但这并不能解释我的问题。

我是否需要多线程才能拥有并发和异步套接字连接?

编辑: 绑定错误..绑定到我的局域网地址,这导致了一些问题。

1 个答案:

答案 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.
 }