/*该例程不包含错误检查代码,主要用于描述创建TCP Client SOCKET并进行通讯的流程*/
#include <stdio.h>
#include <winsock.h>
#pragma comment(lib, "ws2_32.lib")//这句话的前面意思是静态加入一个lib文件也就是库文件ws2_32.lib文件,提供了对以下网络相关API的支持,若使用其中的API,则应该将ws2_32.lib加入工程(否则需要动态载入ws2_32.dll)。
int main(int argc, char *argv[])
{
//int First,Second;
//step 1: 初始化Windows Socket 2.2库
WSADATA wsaData;//功能是:存放windows socket初始化信息
WSAStartup(MAKEWORD(2,2), &wsaData);
//step 2: 创建客户端SOCKET套接字
SOCKET sClient = socket(AF_INET, SOCK_STREAM, 0);
//step 3: 设置服务器地址
sockaddr_in serverAddr;
memset(&serverAddr, 0, sizeof(sockaddr_in));//去掉没有影响,暂时不知用途
/*void *memset(void *s, int ch, size_t n);
函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法*/
serverAddr.sin_family = AF_INET;
//serverAddr.sin_addr.s_addr = inet_addr(argv[1]);
//serverAddr.sin_port = htons((u_short)atoi(argv[2]));
serverAddr.sin_addr.s_addr =inet_addr("127.0.0.1");
//serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
serverAddr.sin_port = htons(5150);
//step 4: 连接服务器
connect(sClient, (SOCKADDR *)&serverAddr, sizeof(serverAddr));//sockaddr和sockaddr_in的区别:二者的占用的内存大小是一致的,因此可以互相转化,从这个意义上说,他们并无区别
//step 5:与服务器进行通讯
while(1)
{
char data[1024] = {0};
printf("%s: ","hu");
scanf("%s",data);
int sendSize = send(sClient, data, strlen(data)+1, 0);//第三个参数是缓冲区中数据的长度,返回所发送的数据的总长度或SOCKET_ERROR错误
int recvSize = recv(sClient, data, 1024, 0);//第三个参数是缓冲区的长度;成功执行时,返回接收到的字节数。另一端已关闭则返回0。失败返回-1
printf("%s: %s\n", "li", data);
}
//step 6:关闭套接字
closesocket(sClient);
//step 7:释放Winsock库
WSACleanup();
getchar();
getchar();
return 0;
}
/*
sockaddr_in(在netinet/in.h中定义):
struct sockaddr_in {
short int sin_family; Address family
unsigned short int sin_port; Port number
struct in_addr sin_addr; Internet address
unsigned char sin_zero[8]; Same size as struct sockaddr
};
struct in_addr {
unsigned long s_addr;
};*/
c语言实现socket网络编程简单的TCP/IP客户服务器连接
4星 · 超过85%的资源 需积分: 46 160 浏览量
2017-02-23
09:07:58
上传
评论 5
收藏 20KB RAR 举报
一天一丢丢
- 粉丝: 114
- 资源: 4