这是启动线程、循环接受数据的一小段代码。 希望对你有帮助!
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参数就可以了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)