c#.net 套接字简单聊天

c#.net 套接字简单聊天,第1张

首先要掌握基本WINSOCK API函数的使用方法,由于采用阻塞模式的函数调用,为支持多客户端而采用了多线程模式,服务端有一接收线程等待客户连接及数据接收,如客户连接成功则再次启动一个线程。

这是启动线程、循环接受数据的一小段代码。 希望对你有帮助!

else

{

//启动线程

AfxBeginThread(thread,0)

dlg->SetForegroundWindow()

dlg->m_list.InsertItem(dlg->count++,"连接成功")

dlg->m_list.InsertItem(dlg->count++,inet_ntoa(dlg->serv.sin_addr))

dlg->m_list.Scroll(size)

dlg->m_button.EnableWindow(TRUE)

while(s!=SOCKET_ERROR)

{

//循环接收数据

s=recv(dlg->msgsock[msgcount],buff,100,0)

dlg->SetForegroundWindow()

if (s!=SOCKET_ERROR)

{

dlg->m_list.InsertItem(dlg->count++,buff)

dlg->m_list.Scroll(size)

dlg->sendtoall(dlg->msgsock[msgcount],buff)

}

}

send(dlg->msgsock[msgcount],"Disconnected",100,0)

dlg->m_list.InsertItem(dlg->count++,"Disconnected")

dlg->m_list.Scroll(size)

dlg->msgsock[msgcount]=NULL

for (int i=0i<50i++)

if (dlg->msgsock[i]!=NULL)

flag=1

if (flag!=1)

dlg->m_button.EnableWindow(FALSE)

closesocket(dlg->msgsock[msgcount])

}

我已前碰到过.

这个是说端口已使用.Address already in use:JVM_Bind.

通常是先确认一下有没有其他的软件使用这个端口,如果是自己开发的Socket,通常不会这么巧的.

如果没有其他软件占用的话,就是另一个很常见的情况.就是说Socket程序中的socket每次在结束关闭之后的几秒或几十秒内通常是还没有关闭的.这是因为如果Socket立刻关闭,而碰巧又有其他的软件马上使用了这个端口时,就会接收到原本应该由前面socket接收的数据.这就是不允许的数据.所以socket被关闭以后,还是会在后台将客户发过来的数据接收完才真正关闭.

版主所说,可能是在关闭程序以后,马上又再运行此程序,导致出现了端口冲突.

对于此种问题,是JAVA语言的一种高级特性,可能没办法改.最好是刷新一下,并稍等片刻再重新运行.

这样:

#include <stdlib.h>

#include <stdio.h>

#include <errno.h>

#include <string.h>

#include <unistd.h>

#include <netdb.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <sys/types.h>

#include <arpa/inet.h>

#include <pthread.h>

#define MAXLINE 100

void *threadsend(void *vargp)

void *threadrecv(void *vargp)

int main()

{

int *clientfdp

clientfdp = (int *)malloc(sizeof(int))

*clientfdp = socket(AF_INET,SOCK_STREAM,0)

struct sockaddr_in serveraddr

struct hostent *hp

bzero((char *)&serveraddr,sizeof(serveraddr))

serveraddr.sin_family = AF_INET

serveraddr.sin_port = htons(15636)

serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1")

if(connect(*clientfdp,(struct sockaddr *)&serveraddr,sizeof(serveraddr)) <0){

      printf("connect error\n")

      exit(1)

}

pthread_t tid1,tid2

printf("connected\n")

while(1){

pthread_create(&tid1,NULL,threadsend,clientfdp)

pthread_create(&tid2,NULL,threadrecv,clientfdp)

}

return EXIT_SUCCESS

}

void *threadsend(void * vargp)

{

//pthread_t tid2

int connfd = *((int *)vargp)

int idata

char temp[100]

while(1){

//printf("me: \n ")

fgets(temp,100,stdin)

send(connfd,temp,100,0)

printf("          client send OK\n")

}

printf("client send\n")

return NULL

}

void *threadrecv(void *vargp)

{

char temp[100]

int connfd = *((int *)vargp)

while(1){

int idata = 0

idata = recv(connfd,temp,100,0)

if(idata >0){

printf("server :\n%s\n",temp)

}

}

return NULL

}

扩展资料:

注意事项

linux下编译多线程代码时,shell提示找不到 pthread_create函数,原因是 pthread.h不是linux系统默认加载的库文件,应该使用类似如下gcc命令进行编译:

gcc echoserver.c -lpthread -o echoserver

只要注意 -lpthread参数就可以了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11998413.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存