//客户端程序
#include "stdio.h"
#include "Winsock2.h"
#include "stdlib.h"
#pragma comment(lib, "Ws2_32.lib")
int main( ) //主函数
{
SOCKET sockClie;
struct hostent *phost;
char sendbuffer[128],recvbuffer[128],hostname[128];
sockaddr_in addrClient,addrServer;
int rval,port;
char server_ip[15],*local_ip;
//求出接收方的信息结构体长度用于recv函数
int len=sizeof(addrServer);
WSADATA wsd;
WORD wVersionRequested;
int err;
//使要求的版本为1.1
wVersionRequested=MAKEWORD(1,1);
err=WSAStartup(wVersionRequested, &wsd);
if (err!=0)
{
//用户没有找到一个可以使用的DLL,返回
perror("there is no DLL to use");
return 0;
}
//确保Windows Sockets DLL支持1.1。
if ( (LOBYTE(wsd.wVersion)!=1) || (HIBYTE(wsd.wVersion)!=1) )
{
perror("there is not right DLL");
WSACleanup();
return 1;
}
sockClie=socket(AF_INET,SOCK_STREAM,0);//建立socket号
if (sockClie==INVALID_SOCKET)
{
perror("there is error in opening sockets\n");
return 2;
}
//输出本机的计算机名和IP地址
if(gethostname(hostname,128)==0)
{
phost=gethostbyname(hostname);
printf("本地主机名是:%s\n",hostname);
local_ip=inet_ntoa(*(struct in_addr *)phost->h_addr_list[0]);
printf("本机 IP 为:%s\n",local_ip);
}
//...
printf("请输入通信的IP地址:");
scanf("%s",&server_ip);
printf("请输入通信的端口:");
scanf("%d",&port);
addrClient.sin_family=AF_INET;
addrClient.sin_port=htons(port); //端口号
addrClient.sin_addr.s_addr=inet_addr(local_ip); //设定IP
if(bind(sockClie, (sockaddr *)&addrClient,sizeof(addrClient))<0) //把IP和端口号等信息绑定在一起
{
perror("there is error in binding sockets\n");
return 3;
}
int length=sizeof(addrClient); //求出本地信息的结构体长度
if(getsockname(sockClie,(struct sockaddr *)&addrClient,&length)<0)
{
perror("there is error in getting name");
return 4;
}
//完善结构体信息
addrServer.sin_family=AF_INET;
addrServer.sin_port=htons(port); //端口号
addrServer.sin_addr.s_addr=inet_addr(server_ip);//设定IP
//memcpy((char *)&addrServer.sin_addr,(char *)phost->h_addr,phost->h_length);
//进行连接
if(connect(sockClie,(struct sockaddr*)&addrServer,sizeof(addrServer))<0)
{
perror("there is error in connecting stream socket");
return 5;
}
//进入一个循环
while(true)
{
//阻塞方法,获得一个客户Socket连接
memset(sendbuffer,0,sizeof(sendbuffer));
memset(recvbuffer,0,sizeof(recvbuffer));
printf("\n请您输入要发送的数据:");
scanf("%s",&sendbuffer);
if((send(sockClie,sendbuffer,strlen(sendbuffer)+1,0))<0)
{
perror("there is error in sending the data");
return 5;
}
printf("等待接收对方发送过来的数据!\n");
if(rval=recv(sockClie,recvbuffer,128,0)==-1)
{
perror("there is error in recving");
break;
}
else
{
printf("接收到%s发过来的数据:%s",inet_ntoa(addrServer.sin_addr),recvbuffer);
}
}
closesocket(sockClie);
WSACleanup();
return 100;
}