第一次写网络收发的程序,出现了许多问题,大家看看

txhby0395 2005-04-21 03:49:11
这是Client
#include <Winsock2.h>
#include <stdio.h>

void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested=MAKEWORD(1,1);

err=WSAStartup(wVersionRequested,&wsaData);
if (err!=0) {
return;
}
if (LOBYTE(wsaData.wVersion)!=1||
HIBYTE(wsaData.wVersion)!=1) {
WSACleanup();
return;
}
SOCKET sockClinet=socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.0.130");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(5000);
connect(sockClinet,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
int send_amount=0;
BOOL send_ok=TRUE;
while (send_ok)
{
send(sockClinet,"123456789",strlen("123456789")+1,0);
}
closesocket(sockClinet);
WSACleanup();
}


这是SERVER
#include <Winsock2.h>
#include <stdio.h>

void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested=MAKEWORD(1,1);

err=WSAStartup(wVersionRequested,&wsaData);
if (err!=0) {
return;
}
if (LOBYTE(wsaData.wVersion)!=1||
HIBYTE(wsaData.wVersion)!=1) {
WSACleanup();
return;
}
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(5000);

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

listen(sockSrv,3);

SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);

while (1)
{
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
char recvBuf[100];
recv(sockConn,recvBuf,100,0);
printf("%s\n",recvBuf);
}

}

服务器端启动后,然后启动客户端,我的服务器端只收到一个客户端传过来的数据,为什么啊???
...全文
72 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ewing1203 2005-04-21
  • 打赏
  • 举报
回复
UINT thread(LPVOID p)
{
char buff[100];
CSize size;
size.cx=0;
size.cy=30;
int s=1,msgcount,loop=1,flag=0;
CCSocketDlg *dlg=(CCSocketDlg*)AfxGetApp()->GetMainWnd();
//获得客户端数量
msgcount=dlg->getcount();
if (msgcount==-1)
loop=0;
if(loop)
{
s=1;
dlg->msgsock[msgcount]=accept(dlg->sock,(sockaddr*)&(dlg->serv),&(dlg->addlen));
if (dlg->msgsock[msgcount]==INVALID_SOCKET)
{
dlg->m_edit.SetWindowText("Error accept");
}
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=0;i<50;i++)
if (dlg->msgsock[i]!=NULL)
flag=1;
if (flag!=1)
dlg->m_button.EnableWindow(FALSE);
closesocket(dlg->msgsock[msgcount]);

}
}
//终止线程
AfxEndThread(0);
return 0;
}
ewing1203 2005-04-21
  • 打赏
  • 举报
回复
服务器端
serv.sin_addr.s_addr=htonl(INADDR_ANY);
serv.sin_family=AF_INET;
serv.sin_port=5000;//htons(5000);
addlen=sizeof(serv);
m_button.EnableWindow(FALSE);
//创建socket
sock=socket(AF_INET,SOCK_STREAM,0);
//绑定
if (bind(sock,(sockaddr*)&serv,addlen))
{
m_edit.SetWindowText("绑定错误");
}else
{
//m_list.InsertItem(count++,inet_ntoa(serv.sin_addr));
m_edit.SetWindowText("服务器创建成功");
//开始侦听
listen(sock,5);
//调用线程
AfxBeginThread(&thread,0);

下面写线程的处理函数

ewing1203 2005-04-21
  • 打赏
  • 举报
回复
你的服务器端只有一个线程接收,当然只有一个客户端了,要多线程的才可以啊,而且你的recv区没有初始化,会出错的。

如下建议
就是在listen之后AfxBeginThread(xxxx,0);
把服务器端的循环,等放到刚才开启的线程内

而且发送和接收的数据最好格式化,用如下
char buff[1024];
memset(buff,0,sizeof(buff));

send:
sprintf(buff,"xxxxxx");
send(sock,buff,sizeof(buff),0);

recv:
char buff[1024];
memset(buff,0,sizeof(buff));
recv(sock,buff,sizeof(buff),0);
然后处理其他的显示

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧