#include <winsock2.h>
#include <stdio.h>
#include <windows.h>
// Need to link with Ws2_32.lib
#pragma comment (lib, "Ws2_32.lib")
int main(int argc, char* argv[])
{
//----------------------
// Initialize Winsock.
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != NO_ERROR) {
wprintf(L"WSAStartup failed with error: %ld\n", iResult);
return 1;
}
//----------------------
// Create a SOCKET for listening for
// incoming connection requests.
SOCKET ListenSocket;
ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ListenSocket == INVALID_SOCKET) {
wprintf(L"socket failed with error: %ld\n", WSAGetLastError());
WSACleanup();
return 1;
}
//----------------------
// The sockaddr_in structure specifies the address family,
// IP address, and port for the socket that is being bound.
sockaddr_in addrServer;
addrServer.sin_family = AF_INET;
addrServer.sin_addr.s_addr = htonl(INADDR_ANY); //实际上是0
addrServer.sin_port = htons(20131);
//绑定套接字到一个IP地址和一个端口上
if (bind(ListenSocket,(SOCKADDR *) & addrServer, sizeof (addrServer)) == SOCKET_ERROR) {
wprintf(L"bind failed with error: %ld\n", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1;
}
//将套接字设置为监听模式等待连接请求
//----------------------
// Listen for incoming connection requests.
// on the created socket
if (listen(ListenSocket, 5) == SOCKET_ERROR) {
wprintf(L"listen failed with error: %ld\n", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1;
}
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
//以一个无限循环的方式,不停地接收客户端socket连接
while(1)
{
//请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字
SOCKET AcceptSocket=accept(ListenSocket,(SOCKADDR*)&addrClient,&len);
if(AcceptSocket == INVALID_SOCKET)break; //出错
//接收缓冲区的大小是50个字符
char recvBuf[51];
while(1){
memset(recvBuf,0,50);
int count =recv(AcceptSocket ,recvBuf,50,0);
if(count==0)break;//被对方关闭
if(count< 0)break;//错误count<0
int sendCount,currentPosition=0;
while((sendCount=send(AcceptSocket ,recvBuf+currentPosition,count,0))!=SOCKET_ERROR)
{
if(sendCount <= 0) break;
count-=sendCount;
currentPosition+=sendCount;
}
if(sendCount==SOCKET_ERROR)break;
printf("%s %s/n",inet_ntoa(addrClient.sin_addr),recvBuf);
// printf("%s",recvBuf);
}
//结束连接
closesocket(AcceptSocket);
}
closesocket(ListenSocket);
WSACleanup();
return 0;
}
#include <winsock2.h>
#include <stdio.h>
#include <windows.h>
#include <io.h>
// Need to link with Ws2_32.lib
#pragma comment (lib, "Ws2_32.lib")
int main(int argc, char* argv[])
{
//----------------------
// Initialize Winsock.
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != NO_ERROR) {
wprintf(L"WSAStartup failed with error: %ld\n", iResult);
return 1;
}
//----------------------
// Create a SOCKET for connecting to server
SOCKET ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ConnectSocket == INVALID_SOCKET) {
printf("Error at socket(): %ld\n", WSAGetLastError() );
WSACleanup();
return 1;
}
//----------------------
// The sockaddr_in structure specifies the address family,
// IP address, and port for the socket that is being bound.
sockaddr_in addrServer;
addrServer.sin_family = AF_INET;
addrServer.sin_addr.s_addr = inet_addr( "127.0.0.1" );
addrServer.sin_port = htons(20131);
//----------------------
// Connect to server.
iResult = connect( ConnectSocket, (SOCKADDR*) &addrServer, sizeof(addrServer) );
if ( iResult == SOCKET_ERROR) {
closesocket (ConnectSocket);
printf("Unable to connect to server: %ld\n", WSAGetLastError());
WSACleanup();
return 1;
}
char buf[1024+1];
//以一个无限循环的方式,不停地接收输入,发送到server
while(1)
{
int count = _read (0, buf, 1024);//从标准输入读入
if(count<=0)break;
int sendCount,currentPosition=0;
while((sendCount=send(ConnectSocket ,buf+currentPosition,count,0))!=SOCKET_ERROR)
{
if(sendCount <= 0) break;
count-=sendCount;
currentPosition+=sendCount;
}
if(sendCount==SOCKET_ERROR)break;
memset(buf,0,1024);
count =recv(ConnectSocket ,buf,1024,0);
if(count==0)break;//被对方关闭
if(count==SOCKET_ERROR)break;//错误count<0
buf[count]='\0';
printf("%s",buf);
}
//结束连接
closesocket(ConnectSocket);
WSACleanup();
return 0;
}