Winsock学习2:用winsock实现socket通讯的client端。
2005-08-12 18:52
579 查看
编译环境:VC++6.0
/*
*File:client.cpp
*
*/
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#define DEFAULT_PORT 5150
#define DEFAULT_BUFFER 4096
#define DEFAULT_MESSAGE "LOGIN"
#define DEFAULT_COUNT 20
int iPort = DEFAULT_PORT;
char szServer[128];
char szMessage[1024];
DWORD dwCount = DEFAULT_COUNT;
BOOL bSendOnly = FALSE;
//Function:usage
//Description:
// Print usage information and exit
void usage()
{
printf("usage:client [-p:x] [-i:ip] [-n:x] [-o] /n/n");
printf(" -p:x Remote port to send to /n");
printf(" -i:str Server's address or host name /n");
printf(" -n:x Number of times to send message/n");
printf(" -o Send messages only;don't recevie/n");
printf("camel 2004-8-29");
ExitProcess(1);
}
// Function:
void ValidateArgs(int argc,char **argv)
{
int i;
for (i = 1; i < argc ;i++)
{
if ((argv[i][0]=='-') || (argv[1][0]=='/') )
{
switch (tolower(argv[i][1]))
{
case 'p':
iPort = atoi(&argv[i][3]);
break;
case 'i':
if(strlen(argv[i]) > 3)
strcpy(szServer,&argv[i][3]);
break;
case 'n':
if(strlen(argv[i])>3)
dwCount = atoi(&argv[i][3]);
case 'o':
bSendOnly = TRUE;
break;
default:
usage();
break;
}
}
}
}
int main(int argc,char ** argv)
{
WSADATA wsd;
SOCKET sClient;
char szBuffer[DEFAULT_BUFFER];
int ret,i;
struct sockaddr_in server;
struct hostent *host = NULL;
printf("======client====/n");
ValidateArgs(argc,argv);
if (WSAStartup(MAKEWORD(2,2),&wsd)!=0)
{
printf("Failed to load Winsock!/n");
return 1;
}
strcpy(szMessage,DEFAULT_MESSAGE);
//
//Create the socket,and attempt to connect to the server
//
sClient = socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
if (sClient == SOCKET_ERROR)
{
printf("socket() failed: %d/n",WSAGetLastError());
return 1;
}
//Select the local interface,and bind to it
server.sin_family = AF_INET;
server.sin_port = htons(iPort);
server.sin_addr.s_addr = inet_addr(szServer);
//
//If the supplied server address wasn't in the form
//"aaa.bbb.ccc.ddd" It's a host name, so try to resolver it
//
if(server.sin_addr.s_addr == INADDR_NONE)
{
host = gethostbyname(szServer);
if(host == NULL)
printf("Unable to resolve server:%s/n",szServer);
return 1;
}
printf("debug: CopyMemory");
//CopyMemory(&server.sin_addr,host->h_addr_list[0],host->h_length);
printf("debug: CopyMemory over");
if(connect(sClient,(struct sockaddr *)&server,sizeof(server)) == SOCKET_ERROR)
{
printf("connect() failed:%d]n",WSAGetLastError());
return 1;
}
//
//Send and receive data
//
for(i = 0; i<dwCount;i++)
{
ret = send(sClient,szMessage,strlen(szMessage),0);
if (ret == 0 )
break;
else if(ret == SOCKET_ERROR)
{
printf("send() failed:%d/n",WSAGetLastError);
break;
}
printf("send %d bytes/n",ret);
if( !bSendOnly)
{
ret = recv(sClient,szBuffer,DEFAULT_BUFFER,0);
if(ret == 0)
break;
else if(ret == SOCKET_ERROR)
{
printf("recv() failed:%d/n",WSAGetLastError());
break;
}
szBuffer[ret] = '/0';
printf("RECV [%d bytes]:'%s'/n",ret,szBuffer);
}
}
closesocket(sClient);
WSACleanup();
return 0;
}
/*
*File:client.cpp
*
*/
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#define DEFAULT_PORT 5150
#define DEFAULT_BUFFER 4096
#define DEFAULT_MESSAGE "LOGIN"
#define DEFAULT_COUNT 20
int iPort = DEFAULT_PORT;
char szServer[128];
char szMessage[1024];
DWORD dwCount = DEFAULT_COUNT;
BOOL bSendOnly = FALSE;
//Function:usage
//Description:
// Print usage information and exit
void usage()
{
printf("usage:client [-p:x] [-i:ip] [-n:x] [-o] /n/n");
printf(" -p:x Remote port to send to /n");
printf(" -i:str Server's address or host name /n");
printf(" -n:x Number of times to send message/n");
printf(" -o Send messages only;don't recevie/n");
printf("camel 2004-8-29");
ExitProcess(1);
}
// Function:
void ValidateArgs(int argc,char **argv)
{
int i;
for (i = 1; i < argc ;i++)
{
if ((argv[i][0]=='-') || (argv[1][0]=='/') )
{
switch (tolower(argv[i][1]))
{
case 'p':
iPort = atoi(&argv[i][3]);
break;
case 'i':
if(strlen(argv[i]) > 3)
strcpy(szServer,&argv[i][3]);
break;
case 'n':
if(strlen(argv[i])>3)
dwCount = atoi(&argv[i][3]);
case 'o':
bSendOnly = TRUE;
break;
default:
usage();
break;
}
}
}
}
int main(int argc,char ** argv)
{
WSADATA wsd;
SOCKET sClient;
char szBuffer[DEFAULT_BUFFER];
int ret,i;
struct sockaddr_in server;
struct hostent *host = NULL;
printf("======client====/n");
ValidateArgs(argc,argv);
if (WSAStartup(MAKEWORD(2,2),&wsd)!=0)
{
printf("Failed to load Winsock!/n");
return 1;
}
strcpy(szMessage,DEFAULT_MESSAGE);
//
//Create the socket,and attempt to connect to the server
//
sClient = socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
if (sClient == SOCKET_ERROR)
{
printf("socket() failed: %d/n",WSAGetLastError());
return 1;
}
//Select the local interface,and bind to it
server.sin_family = AF_INET;
server.sin_port = htons(iPort);
server.sin_addr.s_addr = inet_addr(szServer);
//
//If the supplied server address wasn't in the form
//"aaa.bbb.ccc.ddd" It's a host name, so try to resolver it
//
if(server.sin_addr.s_addr == INADDR_NONE)
{
host = gethostbyname(szServer);
if(host == NULL)
printf("Unable to resolve server:%s/n",szServer);
return 1;
}
printf("debug: CopyMemory");
//CopyMemory(&server.sin_addr,host->h_addr_list[0],host->h_length);
printf("debug: CopyMemory over");
if(connect(sClient,(struct sockaddr *)&server,sizeof(server)) == SOCKET_ERROR)
{
printf("connect() failed:%d]n",WSAGetLastError());
return 1;
}
//
//Send and receive data
//
for(i = 0; i<dwCount;i++)
{
ret = send(sClient,szMessage,strlen(szMessage),0);
if (ret == 0 )
break;
else if(ret == SOCKET_ERROR)
{
printf("send() failed:%d/n",WSAGetLastError);
break;
}
printf("send %d bytes/n",ret);
if( !bSendOnly)
{
ret = recv(sClient,szBuffer,DEFAULT_BUFFER,0);
if(ret == 0)
break;
else if(ret == SOCKET_ERROR)
{
printf("recv() failed:%d/n",WSAGetLastError());
break;
}
szBuffer[ret] = '/0';
printf("RECV [%d bytes]:'%s'/n",ret,szBuffer);
}
}
closesocket(sClient);
WSACleanup();
return 0;
}
相关文章推荐
- Winsock学习1:用winsock实现socket通讯的server端。
- 足迹二:Android客户端与PC服务端之间的SOCKET通讯实现登陆功能(客户端 仅供学习)
- socket一个server多个client间的通讯学习历程和demo
- TCP/IP协议学习(七) 基于C# Socket的Web服务器---动态通讯实现
- 利用ServerSocket和ClientSocket实现简单通讯
- java--socket实现一个client像还有一个client发送信息
- Netty框架的简单使用,实现socket通讯
- 通过Socket实现进程间异步通讯(三)
- osgi实战学习之路:5.生命周期及利用命令、装饰者模式实现基于socket交互Bundle命令demo
- Tomcat源码学习一 Tomcat实现基石Socket
- Socket 服务端使用多线程实现多客户端通讯实例
- SOCKET学习笔记1——TCP通讯
- 在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架
- java使用socket上传文件,实现server端和client端
- P2P聊天程序,学习TcpListener/TcpClient/Socket用法
- QQ是怎么实现通讯的-只为学习
- 使用SOCKET实现TCP/IP协议的通讯
- osgi实战学习之路:5.生命周期及利用命令、装饰者模式实现基于socket交互Bundle命令demo
- python实现socket通讯(UDP)
- python实现socket通讯(TCP)