#include <stdio.h>
#include <iostream>
#include <winsock2.h>
DWORD WINAPI ThreadFunc(LPVOID s1)
{
SOCKET s2=((SOCKET *) s1)[0];
char buf[100];
recv(s2,buf,100,0);
std::cout<<buf;
send(s2,buf,100,0);
closesocket(s2);
return 0;
}
int main(){
WSADATA WsaData;
struct sockaddr_in local;
int s;
int rc;
int err = WSAStartup (0x0101, &WsaData);
if (err == SOCKET_ERROR)
{
printf ("WSAStartup() failed: %ld\n", GetLastError ());
return 1;
}
local.sin_family = AF_INET;
local.sin_port = htons(7500);
local.sin_addr.s_addr = htonl(INADDR_ANY);
s = socket(AF_INET,SOCK_STREAM,0);
SOCKET s1;
if (s<0){
perror("socket error");
exit(1);
}else{
std::cout<<"Create sock: OK\n";
}
rc = bind(s,(struct sockaddr*)&local, sizeof(local));
if (rc<0){
perror("bind error");
exit(1);
}else{
std::cout<<"Bind: OK\n";
}
rc = listen(s,5);
if(rc){
perror("listen error");
exit(1);
}else{
std::cout<<"Listen: OK\n";
}
int local2=sizeof(local);
while(1){
s1=accept(s,0,0);
DWORD thID;// thID идентификатор типа DWORD
CreateThread(NULL,NULL,ThreadFunc,&s1,NULL,&thID);
}
return 0;
}
проблема с клиент - сервер приложением
сервер
Код:
клиент
Код:
#include <stdio.h>
#include <iostream>
#include <winsock2.h>
int main(){
WSADATA WsaData;
sockaddr_in peer;
int s;
int rc;
int err = WSAStartup (0x0101, &WsaData);
if (err == SOCKET_ERROR)
{
printf ("WSAStartup() failed: %ld\n", GetLastError ());
return 1;
}
while(true){
peer.sin_family = AF_INET;
peer.sin_port = htons(7500);
peer.sin_addr.s_addr = inet_addr("127.0.0.1");
s = socket(AF_INET,SOCK_STREAM,0);
rc = connect(s,(sockaddr*)&peer, sizeof(peer));
char buf[100];
char buf2[100];
fgets(buf,100,stdin);
if(send(s,buf,100,0)!=0){
std::cout<<"->Server: "<<buf;
}
recv(s,buf2,100,0);
std::cout<<"Server: "<<buf2<<"\n";
closesocket(s);
}
return 0;
}
#include <iostream>
#include <winsock2.h>
int main(){
WSADATA WsaData;
sockaddr_in peer;
int s;
int rc;
int err = WSAStartup (0x0101, &WsaData);
if (err == SOCKET_ERROR)
{
printf ("WSAStartup() failed: %ld\n", GetLastError ());
return 1;
}
while(true){
peer.sin_family = AF_INET;
peer.sin_port = htons(7500);
peer.sin_addr.s_addr = inet_addr("127.0.0.1");
s = socket(AF_INET,SOCK_STREAM,0);
rc = connect(s,(sockaddr*)&peer, sizeof(peer));
char buf[100];
char buf2[100];
fgets(buf,100,stdin);
if(send(s,buf,100,0)!=0){
std::cout<<"->Server: "<<buf;
}
recv(s,buf2,100,0);
std::cout<<"Server: "<<buf2<<"\n";
closesocket(s);
}
return 0;
}
Цитата: pihto
Код:
while(1){
s1=accept(s,0,0);
DWORD thID;// thID идентификатор типа DWORD
CreateThread(NULL,NULL,ThreadFunc,&s1,NULL,&thID);
}
return 0;
}
s1=accept(s,0,0);
DWORD thID;// thID идентификатор типа DWORD
CreateThread(NULL,NULL,ThreadFunc,&s1,NULL,&thID);
}
return 0;
}
Вы используете одну и ту же переменную и для работы в потоке и для того, чтобы принять новое соединение. Где гарантия, что пока поток работает с сокетом, основной поток не перезатрет s1, приняв новое соединение, и что будет тогда, вам не скажет никто.
Решение - сохранять сокеты для принятых соединений где-нибудь в контейнере.