基于tcp socket双向传输 多线程编程解决思路
基于tcp socket双向传输 多线程编程
如题,手上有一个单向的socket,老师说要双向的,可是我连最简单的单向socket也不懂,更别说双向了。不知道怎么把单向用线程改成双向。多线程编程完全不知道。大神可以推荐多线程编程的书,或者指点一下怎么改成双向的,有代码的给我当然不会介意~~~~~~~
服务器
#include <winsock.h>
#include <process.h>
#pragma comment(lib,"ws2_32")
#include <stdio.h>
int main(int argc,char *[])
{
WSADATA wsaData;
WORD sockVersion = MAKEWORD(2,2);
if(WSAStartup(sockVersion,&wsaData)!=0)
return 0;
SOCKET sServer = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(sServer==INVALID_SOCKET)
{
printf("socket error\n");
return 0;
}
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(1129);
sin.sin_addr.S_un.S_addr = INADDR_ANY;
//bind套接字
if(bind(sServer,(LPSOCKADDR)&sin,sizeof(sin)) == SOCKET_ERROR)
{
printf("bind error!\n");
return 0;
}
//listen模式
if(listen(sServer,5) == SOCKET_ERROR)
{
printf("listen error!\n");
closesocket(sServer);
return 0;
}
//循环接受连接请求
sockaddr_in remoteAddr;
SOCKET sClient;
int nAddrLen=sizeof(SOCKADDR_IN);
char revData[255];
while(1)
{
sClient = accept (sServer,(SOCKADDR*)&remoteAddr,&nAddrLen);
if(sClient==INVALID_SOCKET)
{
printf("accept error\n");
continue;
}
printf("接受来自%s的连接.\n",inet_ntoa(remoteAddr.sin_addr));
while(true)
{
int ret = recv(sClient,revData,255,0);
if(ret==0||(ret==SOCKET_ERROR&&WSAGetLastError()==WSAECONNRESET))
{
printf("%s关闭连接\n",inet_ntoa(remoteAddr.sin_addr));
closesocket(sClient);
break;
}
else
{
revData[ret]='\0';
printf("%s",revData);
}
}
}
closesocket(sServer);
WSACleanup();
return 0;
}
客户端
#include <winsock.h>
#pragma comment(lib,"ws2_32")
#include <stdio.h>
#define PORT 1129
#define ADDRESS "127.0.0.1"
int main()
{//加载winsock库
WSADATA wsaData;
WORD sockVersion = MAKEWORD(2,2);
if(WSAStartup(sockVersion,&wsaData)!=0)
return 0;
//创建套接字
SOCKET sClient = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(sClient==INVALID_SOCKET)
{
printf("socket error\n");
return 0;
}
//socket中装入远程地址信息
SOCKADDR_IN remote;
remote.sin_family = AF_INET;
remote.sin_port = htons(1129);
remote.sin_addr.S_un.S_addr = inet_addr(ADDRESS);
if(connect(sClient,(SOCKADDR *)&remote,sizeof(SOCKADDR))==SOCKET_ERROR)
{
printf("connect error\n");
closesocket(sClient);
return 0;
}
while(true)
{
char SendData[255];
int i,ch;
for( i = 0; (i < 254) && ((ch = getchar()) != EOF) && (ch!='\n'); i++)
SendData[i] = (char)ch;
SendData[i] = '\n';
SendData[i+1] = '\0';
send(sClient,SendData,i+2,0);
}
closesocket(sClient);
WSACleanup();
return 0;
}
------解决思路----------------------
客户端:发送
服务器:接收,发送
客户端:接收,发送
服务器:接收,发送
。。。
如题,手上有一个单向的socket,老师说要双向的,可是我连最简单的单向socket也不懂,更别说双向了。不知道怎么把单向用线程改成双向。多线程编程完全不知道。大神可以推荐多线程编程的书,或者指点一下怎么改成双向的,有代码的给我当然不会介意~~~~~~~
服务器
#include <winsock.h>
#include <process.h>
#pragma comment(lib,"ws2_32")
#include <stdio.h>
int main(int argc,char *[])
{
WSADATA wsaData;
WORD sockVersion = MAKEWORD(2,2);
if(WSAStartup(sockVersion,&wsaData)!=0)
return 0;
SOCKET sServer = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(sServer==INVALID_SOCKET)
{
printf("socket error\n");
return 0;
}
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(1129);
sin.sin_addr.S_un.S_addr = INADDR_ANY;
//bind套接字
if(bind(sServer,(LPSOCKADDR)&sin,sizeof(sin)) == SOCKET_ERROR)
{
printf("bind error!\n");
return 0;
}
//listen模式
if(listen(sServer,5) == SOCKET_ERROR)
{
printf("listen error!\n");
closesocket(sServer);
return 0;
}
//循环接受连接请求
sockaddr_in remoteAddr;
SOCKET sClient;
int nAddrLen=sizeof(SOCKADDR_IN);
char revData[255];
while(1)
{
sClient = accept (sServer,(SOCKADDR*)&remoteAddr,&nAddrLen);
if(sClient==INVALID_SOCKET)
{
printf("accept error\n");
continue;
}
printf("接受来自%s的连接.\n",inet_ntoa(remoteAddr.sin_addr));
while(true)
{
int ret = recv(sClient,revData,255,0);
if(ret==0||(ret==SOCKET_ERROR&&WSAGetLastError()==WSAECONNRESET))
{
printf("%s关闭连接\n",inet_ntoa(remoteAddr.sin_addr));
closesocket(sClient);
break;
}
else
{
revData[ret]='\0';
printf("%s",revData);
}
}
}
closesocket(sServer);
WSACleanup();
return 0;
}
客户端
#include <winsock.h>
#pragma comment(lib,"ws2_32")
#include <stdio.h>
#define PORT 1129
#define ADDRESS "127.0.0.1"
int main()
{//加载winsock库
WSADATA wsaData;
WORD sockVersion = MAKEWORD(2,2);
if(WSAStartup(sockVersion,&wsaData)!=0)
return 0;
//创建套接字
SOCKET sClient = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(sClient==INVALID_SOCKET)
{
printf("socket error\n");
return 0;
}
//socket中装入远程地址信息
SOCKADDR_IN remote;
remote.sin_family = AF_INET;
remote.sin_port = htons(1129);
remote.sin_addr.S_un.S_addr = inet_addr(ADDRESS);
if(connect(sClient,(SOCKADDR *)&remote,sizeof(SOCKADDR))==SOCKET_ERROR)
{
printf("connect error\n");
closesocket(sClient);
return 0;
}
while(true)
{
char SendData[255];
int i,ch;
for( i = 0; (i < 254) && ((ch = getchar()) != EOF) && (ch!='\n'); i++)
SendData[i] = (char)ch;
SendData[i] = '\n';
SendData[i+1] = '\0';
send(sClient,SendData,i+2,0);
}
closesocket(sClient);
WSACleanup();
return 0;
}
------解决思路----------------------
客户端:发送
服务器:接收,发送
客户端:接收,发送
服务器:接收,发送
。。。