/***************************************************************************************************
socket client 编程
功能: 向客户端发送 i am zhang yong hui 一次
从客户端接收一次数据,输出数据个数(<10)。
环境: VC2005 C语言编写
版本: SCV1.1 (socket client 演示)
编者: 张永辉
时间: 2011年11月14日
参考:
C语言编程---socket基础.doc
***************************************************************************************************/
#include "stdafx.h"
#include <Winsock2.h> //socket
#pragma comment(lib,"ws2_32")
#include <stdio.h> //printf
#define SERVER_PORT 8080 //客户端端口
#define SERVER_IPADDR "169.254.123.236" //客服端IP
int main(int argc, _TCHAR* argv[])
{
int err;
//第一步:加载winsock库
WSADATA wsaData;
WORD sockVersion = MAKEWORD(2,2); //使用2.2版本
err = WSAStartup(sockVersion,&wsaData); //申请使用SOCKET,返回0表示成功,才可以使用其库函数。
if(err!=0) //
{
printf("socket error 0 \n");
return 0;
}
//第二步:创建套接字
//参数解释:AF_INET表示TCP/IP协议族,SOCK_STREAM流套接字类型,IPPROTO_TCP指TCP协议
SOCKET sClient = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); //新创建的套接字的描述符
if(sClient==INVALID_SOCKET) //INVALID_SOCKET表示创建失败
{ //
printf("socket error 1 \n");
return 0;
}
//第三步:绑定的Socket
struct sockaddr_in saddr; //创建结构
saddr.sin_family = AF_INET; //AF_INET指定为TCP/IP协议族的套接字
saddr.sin_port = htons(SERVER_PORT); //指明端口号 htons??
//saddr.sin_addr.s_addr = htonl(INADDR_ANY); //无论哪个网段的客户都能与其通讯。(与下句互斥)
saddr.sin_addr.S_un.S_addr = inet_addr(SERVER_IPADDR); //固定IP,inet_addr()将字符串IP转换成整行IP
//参数:待绑定的Socket描述符,指定sockaddr结构,namelen
bind(sClient,(struct sockaddr *)&saddr,sizeof(saddr)); //仅服务端调用此函数。
//第四步:连接客户端
//参数:
err = connect(sClient,(struct sockaddr *)&saddr,sizeof(saddr));//连接成功,connect返回0;失败则返回SOCKET_ERROR
if(err == SOCKET_ERROR)
{
closesocket(sClient);
WSACleanup();
printf("socket error 2 \n");
return 0;
}
//第五步:发送数据
char SendData[]="i am zhang yong hui";
//参数:套接字,缓冲区,字节数,一般为0
send(sClient,SendData,strlen(SendData),0); //失败返回SOCKET_ERROR,具体看发送流程。
//第六步:接收数据
//参数:套接字,缓冲区,字节数,一般为0
char RecvData[10];
err = recv(sClient,SendData,10,0); //在copy时出错返回SOCKET_ERROR,断网返回0,其他时候返回接收到的数据个数。有超时是多少?
printf("recv num = %d \n",err); //打印接收到的数目
//关闭一个描述符为s套接字
closesocket(sClient);
//最后一步:解除与Socket库的绑定并且释放Socket库所占用的系统资源
WSACleanup();
printf("num = %d\n",sockVersion);
//------------------------------------------------------
printf("the end of project\n");
return 0;
}