网络编程学习笔记一
来源:互联网 发布:linux查看挂载目录 编辑:程序博客网 时间:2024/05/21 15:05
本学期开始学习网络编程,第一个任务是学时TCP/IP客户端服务器的搭建
用C写服务器端(Server.cpp)
#pragma comment(lib, "ws2_32.lib")//预编译#include <stdio.h>#include <winsock2.h>int main(int argc, char *argv[]){//step1:初始化Windows Socket 2.2库WSADATA wsaData;WSAStartup(MAKEWORD(2,2), &wsaData);//step2:创建一个新的Socket来响应客户端的连接请求SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//step3:填写服务器地址信息int port = 5150;// 端口为5150SOCKADDR_IN serverAddr;serverAddr.sin_family = AF_INET;serverAddr.sin_port = htons(port);//serverAddr.sin_addr.s_addr =inet_addr("10.66.103.187");serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);//IP地址为INADDR_ANY,使用htonl将IP地址转换为网络格式//step4:绑定监听端口bind(sListen, (SOCKADDR *)&serverAddr, sizeof(serverAddr));//step5:开始监听,指定三次握手等待队列长度为5listen(sListen, 5);printf("开始监听......\n");while(true){//step6:接受新的连接SOCKETsNewConnection;SOCKADDR_IN clientAddr;memset(&clientAddr, 0, sizeof(clientAddr));int clientAddrLen = sizeof(clientAddr);sNewConnection = accept(sListen,(SOCKADDR *)&clientAddr, &clientAddrLen);//step7:新的连接建立后,就可以互相通信了,//在这个简单的例子中,//我们发送"Welcome to Network Programing!",然后关闭连接 //进行数据交换while(1){char message[1024];int recvSize = recv(sNewConnection,message, sizeof(message), 0);if(recvSize <= 0)break;printf("%s: %s\n", "hu", message);char data[1024] = {0};printf("%s: ","li"); scanf("%s",data);send(sNewConnection, data, strlen(message)+1, 0);}//关闭与客户通讯的套接字closesocket(sNewConnection);printf("%s","另一端关闭");}//step8:关闭套接字closesocket(sListen);//step9:释放Windows Socket DLL的相关资源WSACleanup();return 0;}
然后是客户端(client.cpp)
#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库 WSADATAwsaData;//功能是:存放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。失败返回-1printf("%s: %s\n", "li", data);}//step 6:关闭套接字 closesocket(sClient); //step 7:释放Winsock库 WSACleanup();getchar();getchar(); return 0;}
最后是测试结果:
1 0
- 网络编程学习笔记一
- 网络编程学习笔记一:Socket编程
- 网络编程学习笔记一:Socket编程
- 网络编程学习笔记一:Socket编程
- 网络编程学习笔记一:Socket编程
- 网络编程学习笔记一:Socket编程
- 网络编程学习笔记一:Socket编程
- 网络编程学习笔记一:Socket编程
- 网络编程学习笔记一:Socket编程
- 网络编程学习笔记一:Socket编程
- 网络编程学习笔记一:Socket编程
- 网络编程学习笔记一:Socket编程
- 网络编程学习笔记一:Socket编程
- 网络编程学习笔记一:Socket编程
- 网络编程学习笔记一:Socket编程
- 网络编程学习笔记一:Socket编程
- 网络编程学习笔记一:Socket编程
- 网络编程学习笔记一:Socket编程
- Redis之——搭建高可用及负载均衡的Redis
- uva11270 Tiling Dominoes
- maven阿里仓库
- MySQL查看当前数据库
- LeetCode Problem No1 Two Sum
- 网络编程学习笔记一
- distinct 去重问题
- 最小 最大 平均值(文件)
- 【Linux基础学习之一】关于Linux的一些基本操作(linux登陆、口令文件、多终端登陆)
- Tomcat部署时war和war exploded区别以及平时踩得坑
- wustoj1654医院设置
- 如何辨别高潜牛人的六个方法,据说源自500强HR
- LeetCode:Nim Game
- Samba—share(共享模式)