windows_socket编程实战
WindowsVSCode环境下编写socket程序
Windows下的Socket程序与Linux的gnu的Socket不同,使用的是winsock2.h, ws2_32.lib来实现的。不需要去下载或找到ws2_32.lib这个文 件。
在CMakeList.txt的配置中加入下面一句话就可以解决。
cmakelist.txt
cmake_minimum_required(VERSION 3.0.0) project(rtt-client VERSION 0.1.0)
include(CTest) enable_testing()
file(GLOB SOURCES *.c) add_executable(${CMAKE_PROJECT_NAME} rtt-client.c) target_link_libraries(${CMAKE_PROJECT_NAME} ws2_32)
int main(int argc, char** argv) { WSADATA wsaData; int iResult = WSAStartup(MAKEWORD(2 ,2), &wsaData); if (iResult != 0) { printf("error at WSASturtup\n"); return 0; } }
set(CPACK_PROJECT_NAME ${PROJECT_NAME}) set(CPACK_PROJECT_VERSION ${PROJECT_VERSION}) include(CPack)
target_link_libraries(${CMAKE_PROJECT_NAME} ws2_32)
VS2010下Socket编程的步骤及示例
VS2010下Socket编程的步骤及示例一、Socket简单介绍Socket的中文翻译是套接字,它是TCP/IP网络环境下应用程序与底层通信驱动程序之间运行的开发接口,它可以将应用程序与具体的TCP/IP隔离开来,使得应用程序不需要了解TCP/IP的具体细节,就能够实现数据传输。
关于Socket需要了解的还有很多,我将在随后的章节里陆续写上。
二、Socket应用程序框架这里先声明一下,我用的是32位win7系统,vs2010编译器。
首先新建一个没有预编译头的Win32控制台应用程序。
应用程序框架如下:#include<iostream>#include<winsock2.h>//注释1#pragma comment (lib,"ws2_32.lib")//注释1#include<stdlib.h>using namespace std;int main(){WSADA TA wsadata;//注释2if( WSAStartup( MAKEWORD(2,2),&wsadata )!=0 )//注释3{printf("WSAStartup无法初始化!\n");return 0;}//使用Winsock实现网络通信////最后应该做的清理工作if(WSACleanup()==SOCKET_ERROR)//注释4printf("WSACleanup出错\n");system("pause");return 0;}注释1:我们在vs中一般使用Winsock2实现网络通信功能,需要引进头文件winsock2.h和库文件ws2_32.lib。
注释2:WSADA TA结构体中主要包含了系统所支持的Winsock版本信息。
注释3“WSAStartup()函数用于初始化Windows Sockets,并返回WSADA TA结构体。
C++实例(简单的Windows套接字(Socket)例子)
Server.exe PortNumber,例如Server 8000 Client.exe IPAddress PortNumber,例如Client 127.0.0.1 8000 然后在客户端的命令⾏输⼊字符串并回车,客户端将会把消息发送到服务器,考试.⼤提⽰服务器再把消息传回客户端。
服务器端,Server.cpp //Server.cpp #include #include #include #pragma comment(lib,"ws2_32.lib") int main(int argc, char* argv[]){ //判断是否输⼊了端⼝号 if(argc!=2){ printf("Usage: %s PortNumber\n",argv[0]); exit(-1); } //把端⼝号转化成整数 short port; if((port = atoi(argv[1]))==0){ printf("端⼝号有误!"); exit(-1); } WSADATA wsa; //初始化套接字DLL if(WSAStartup(MAKEWORD(2,2),&wsa)!=0){ printf("套接字初始化失败!"); exit(-1); } //创建套接字 SOCKET serverSocket; if((serverSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET){ printf("创建套接字失败!"); exit(-1); } struct sockaddr_in serverAddress; memset(&serverAddress,0,sizeof(sockaddr_in)); serverAddress.sin_family=AF_INET; serverAddress.sin_addr.S_un.S_addr = htonl(INADDR_ANY); serverAddress.sin_port = htons(port); //绑定 if(bind(serverSocket,(sockaddr*)&serverAddress,sizeof(serverAddress))==SOCKET_ERROR){ printf("套接字绑定到端⼝失败!端⼝: %d\n",port); exit(-1); } //进⼊侦听状态 if(listen(serverSocket,SOMAXCONN)==SOCKET_ERROR){ printf("侦听失败!"); exit(-1); } printf("Server %d is listening......\n",port); SOCKET clientSocket;//⽤来和客户端通信的套接字 struct sockaddr_in clientAddress;//⽤来和客户端通信的套接字地址 memset(&clientAddress,0,sizeof(clientAddress)); int addrlen = sizeof(clientAddress); //接受连接 if((clientSocket=accept(serverSocket,(sockaddr*)&clientAddress,&addrlen))==INVALID_SOCKET){ printf("接受客户端连接失败!"); exit(-1); } printf("Accept connection from %s\n",inet_ntoa(clientAddress.sin_addr)); char buf[4096]; while(1){ //接收数据 int bytes; if((bytes=recv(clientSocket,buf,sizeof(buf),0))==SOCKET_ERROR){ printf("接收数据失败!\n"); exit(-1); } buf[bytes]='\0'; printf("Message from %s: %s\n",inet_ntoa(clientAddress.sin_addr),buf); if(send(clientSocket,buf,bytes,0)==SOCKET_ERROR){ printf("发送数据失败!"); exit(-1); } } //清理套接字占⽤的资源 WSACleanup(); return 0; } 客户端,Client.cpp //Client.cpp #include #include #include #pragma comment(lib,"ws2_32.lib") int main(int argc, char* argv[]){ //判断是否输⼊了IP地址和端⼝号 if(argc!=3){ printf("Usage: %s IPAddress PortNumber\n",argv[0]); exit(-1); } //把字符串的IP地址转化为u_long unsigned long ip; if((ip=inet_addr(argv[1]))==INADDR_NONE){ printf("不合法的IP地址:%s",argv[1]); exit(-1); } //把端⼝号转化成整数 short port; if((port = atoi(argv[2]))==0){ printf("端⼝号有误!"); exit(-1); } printf("Connecting to %s:%d......\n",inet_ntoa(*(in_addr*)&ip),port); WSADATA wsa; //初始化套接字DLL if(WSAStartup(MAKEWORD(2,2),&wsa)!=0){ printf("套接字初始化失败!"); exit(-1); } //创建套接字 SOCKET sock; if((sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET){ printf("创建套接字失败!"); exit(-1); } struct sockaddr_in serverAddress; memset(&serverAddress,0,sizeof(sockaddr_in)); serverAddress.sin_family=AF_INET; serverAddress.sin_addr.S_un.S_addr = ip; serverAddress.sin_port = htons(port); //建⽴和服务器的连接 if(connect(sock,(sockaddr*)&serverAddress,sizeof(serverAddress))==SOCKET_ERROR){ printf("建⽴连接失败!"); exit(-1); } char buf[4096]; while(1){ printf(">"); //从控制台读取⼀⾏数据 gets(buf); //发送给服务器 if(send(sock,buf,strlen(buf),0)==SOCKET_ERROR){ printf("发送数据失败!"); exit(-1); } int bytes; if((bytes=recv(sock,buf,sizeof(buf),0))==SOCKET_ERROR){ printf("接收数据失败!\n"); exit(-1); } buf[bytes]='\0'; printf("Message from %s: %s\n",inet_ntoa(serverAddress.sin_addr),buf); } //清理套接字占⽤的资源 WSACleanup(); return 0; }。
socket编程 实验报告
socket编程实验报告《Socket编程实验报告》在计算机网络通信中,Socket编程是一种常见的通信方式,它可以在不同的计算机之间实现数据的传输和通信。
本次实验旨在通过Socket编程实现一个简单的客户端和服务器端通信,并对其进行测试和分析。
实验环境:- 操作系统:Windows 10- 开发工具:Visual Studio Code- 编程语言:Python实验步骤:1. 设计客户端和服务器端的通信协议2. 编写客户端和服务器端的代码3. 运行客户端和服务器端,并进行通信测试4. 分析通信过程中的数据传输情况实验结果:经过实验,我们成功实现了一个简单的客户端和服务器端通信程序。
在测试过程中,我们发现数据可以正常地在客户端和服务器端之间传输,而且通信过程稳定可靠。
分析:通过本次实验,我们深入了解了Socket编程的基本原理和实现方式。
Socket编程可以灵活地实现不同计算机之间的通信,为网络通信提供了重要的技术支持。
在实际应用中,Socket编程可以用于实现各种网络通信功能,如网页浏览、文件传输、视频流等。
总结:通过本次实验,我们对Socket编程有了更深入的了解,并掌握了基本的编程技巧和调试方法。
Socket编程是网络通信中的重要技术,对于计算机网络领域的学习和应用具有重要的意义。
希望通过今后的实践和学习,我们能够进一步深化对Socket编程的理解,为网络通信技术的发展做出贡献。
通过本次实验,我们对Socket编程有了更深入的了解,并掌握了基本的编程技巧和调试方法。
Socket编程是网络通信中的重要技术,对于计算机网络领域的学习和应用具有重要的意义。
希望通过今后的实践和学习,我们能够进一步深化对Socket编程的理解,为网络通信技术的发展做出贡献。
跨平台(Windows+Linux)的Socket通讯程序(一)—底层封装(转)
跨平台(Windows+Linux)的Socket通讯程序(一)—底层封装(转)【摘要】编写Socket通讯程序是一个老话题。
本文重点介绍Windows平台和Linux平台Socket通讯的不同,采用C++,编制了一个简单的跨平台的Socket通讯库。
一、Socket通讯的基础知识Socket通讯是两个计算机之间最基本的通讯方法,有TCP和UDP 两种协议。
关于这两种协议的区别,不少文章已有详述,这里,稍微总结一下:1.TCP是面向连接的,是“流”式的,意即通讯两端建立了一个“数码流管”,该流无头无尾,接收端保证接收顺序,但不保证包的分割。
2.UDP是面向无连接的,是“包”式的,意即通讯两端自由发送数据包,接收端不保证接收顺序,但保证包的分割与发送端一致。
正是基于上述二者的不同,在编程上,它们的区别如下:对TCP 连接,服务器端过程(bind->listen->accept->send/receive)与客户端不相同(connect->send/receive),对UDP连接,二者似乎更对等一些(服务器端仅需要bind)。
二、socket在windows下和linux下的区别一些文章也已涉及,这里,也是综合一下,并加上自己的理解。
三、跨平台的Socket辅助程序以下给出源代码。
sock_wrap.h代码如下,其中用到了platform.h,定义_WIN32_PLATFROM_和_LINUX_PLATFROM_两个宏。
[cpp]view plaincopy1.#ifndef _SOCK_WRAP_H_2.#define _SOCK_WRAP_H_3.4.#include "platform.h"5.6.#if defined(_WIN32_PLATFROM_)7.#include <winsock2.h>8.typedef SOCKET HSocket;9.#endif10.11.#if defined(_LINUX_PLATFORM_)12.#include <netinet/in.h>13.#include <sys/socket.h>14.#include <sys/types.h>15.16.typedef int HSocket;17.#define SOCKET_ERROR (-1)18.#define INVALID_SOCKET 019.#endif20.21.22.typedef struct23.{24.int block;25.int sendbuffersize;26.int recvbuffersize;27.int lingertimeout;28.int recvtimeout;29.int sendtimeout;30.} socketoption_t;31.32.typedef struct33.{34.int nbytes;35.int nresult;36.} transresult_t;37.38.int InitializeSocketEnvironment();39.void FreeSocketEnvironment();40.void GetAddressFrom(sockaddr_in *addr, const char *i p, int port);41.void GetIpAddress(char *ip, sockaddr_in *addr);42.bool IsValidSocketHandle(HSocket handle);43.int GetLastSocketError();44.45.HSocket SocketOpen(int tcpudp);46.void SocketClose(HSocket &handle);47.48.int SocketBlock(HSocket hs, bool bblock);49.int SocketTimeOut(HSocket hs, int recvtimeout, int sen dtimeout, int lingertimeout);50.51.int SocketBind(HSocket hs, sockaddr_in *addr);52.HSocket SocketAccept(HSocket hs, sockaddr_in *addr) ;53.int SocketListen(HSocket hs, int maxconn);54.55.void SocketSend(HSocket hs, const char *ptr, int nbyte s, transresult_t &rt);56.void SocketRecv(HSocket hs, char *ptr, int nbytes, tran sresult_t &rt);57.void SocketTryRecv(HSocket hs, char *ptr, int nbytes, i nt milliseconds, transresult_t &rt);58.void SocketTrySend(HSocket hs, const char *ptr, int nb ytes, int milliseconds, transresult_t &rt);59.60.void SocketClearRecvBuffer(HSocket hs);61.62.class CSockWrap63.{64.public:65.CSockWrap(int tcpudp);66.~CSockWrap();67.void SetAddress(const char *ip, int port);68.void SetAddress(sockaddr_in *addr);69.int SetTimeOut(int recvtimeout, int sendtimeout, int li ngertimeout);70.int SetBufferSize(int recvbuffersize, int sendbuffersize);71.int SetBlock(bool bblock);72.73.HSocket GetHandle () { return m_hSocket;}74.void Reopen(bool bForceClose);75.void Close();76.transresult_t Send(void *ptr, int nbytes);77.transresult_t Recv(void *ptr, int nbytes );78.transresult_t TrySend(void *ptr, int nbytes, int milliseco nds);79.transresult_t TryRecv(void *ptr, int nbytes, int milliseco nds );80.void ClearRecvBuffer();81.82.protected:83.HSocket m_hSocket;84.sockaddr_in m_stAddr;85.int m_tcpudp;86.};87.88.89.#endifsock_wrap.cpp代码如下,其中引用了lightThread.h和spantime.h,它们的代码见“跨平台(Windows+Linux)的线程辅助程序”。
Windows下C语言的Socket编程例子(TCP和UDP)
Windows下C语言的Socket编程例子(TCP和UDP)sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);基于TCP的socket编程是采用的流式套接字。
在这个程序中,将两个工程添加到一个工作区。
要链接一个ws2_32.lib的库文件。
服务器端编程的步骤:1:加载套接字库,创建套接字(WSAStartup()/socket());2:绑定套接字到一个IP地址和一个端口上(bind());3:将套接字设置为监听模式等待连接请求(listen());4:请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());5:用返回的套接字和客户端进行通信(send()/recv());6:返回,等待另一连接请求;7:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。
客户端编程的步骤:1:加载套接字库,创建套接字(WSAStartup()/socket());2:向服务器发出连接请求(connect());3:和服务器端进行通信(send()/recv());4:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。
函数介绍:1.#include<sys/socket.h>int socket (int family, int type, int protocol);返回值,成功为非负整数,成为套接口描数字;出错为-1、family参数:AF_INET --ipv4;AF_INET6--ipv6;AF_LOCAL--unix域协议;AF_ROUTE--路由socket;AF_KEY--密钥socket;type参数:SOCK_STREAM--字节流套接口SOCK_DGRAM--数据报套接口SOCK_RAM--原始套接口protocal参数一般置为0,当type为SOCK_RAM时不同2.#include<sys/socket.h>int connect (int sockfd, const struct sockaddr* servaddr, socklen_t addlen);返回值,0-成功;-1-出错;servaddr参数可以为sockaddr_in和sockaddr_in6类型,但是都必须强制转化为sockaddr指针类型;connect函数的出错处理:(1)ETIMEOUT-connection timed out 目的主机不存在,没有返回任何相应,例如主机关闭(2)ECONNREFUSED-connection refused(硬错)到达目的主机后,由于各种原因建立不了连接,主机返回RST(复位)响应,例如主机监听进程未启用,tcp取消连接等(3)EHOSTTUNREACH-no route to host(软错)路由上引发了一个目的地不可达的ICMP错误其中(1)(3),客户端会进行定时多次重试,一定次数后才返回错误。
vc 6.0 SOCKET 通信 最最简单实例
vc 6.0 SOCKET 通信最最简单实例vc++ 6.0分别建立Win32 Console Application类型的应用程序Server_Console和Client_console。
选择Project>Setting,在Link选项卡的Objecct/library modules框中加上库wsock32.lib。
在mian函数的前面,#include"stdafx.h"的后面,加上#include <winsock.h>。
服务器端程序代码:// TcpServer.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <stdio.h>#include <winsock.h>int main(int argc, char* argv[]){WORD wVersion;WSADATA wsaData;int err;wVersion = MAKEWORD(1,1);//初始化Windows Socketserr = WSAStartup(wVersion,&wsaData);if(err != 0){return 0;}//建立流式套接字SOCKET listenSocket = socket(AF_INET,SOCK_STREAM,0);sockaddr_in addr;int nSockErr;addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);addr.sin_family = AF_INET;//设定监听端口5001addr.sin_port=htons(5001);//绑定套接字if(bind(listenSocket,(struct sockaddr*)&addr,sizeof(addr)) == SOCKET_ERROR)nSockErr = WSAGetLastError();//将套接字设置成监听状态if(listen(listenSocket,5) == SOCKET_ERROR)nSockErr = WSAGetLastError();printf("服务器正在监听...\n");//等待客户的链接请求SOCKET connectSocket = accept(listenSocket,NULL,NULL);if(connectSocket == INVALID_SOCKET){printf("接受错误...\n");nSockErr = WSAGetLastError();}else{//有客户链接请求被成功接收char buf[1024];memset(buf,0,sizeof(char)*1024);//接收客户端传输过来的数据int n = recv(connectSocket,buf,1024,MSG_PEEK);if(n>0)printf("服务器已经接受%d个字符:%s\n",n,buf);}//关闭套接字::closesocket(listenSocket);::closesocket(connectSocket);::WSACleanup();return 1;}客户端程序代码:// TcpClient.cpp : Defines the entry point for the console application. //#include "stdafx.h"#include <stdio.h>#include <winsock.h>int main(int argc, char* argv[]){WORD wVersion;WSADATA wsaData;int err;wVersion = MAKEWORD(1,1);//初始化Windows Socketserr = WSAStartup(wVersion,&wsaData);if(err != 0){return 0;}//创建流式套接字SOCKET connectSocket = ::socket(AF_INET,SOCK_STREAM,0);sockaddr_in servAddr;servAddr.sin_family = AF_INET;//设置服务器端主机的地址和端口号,这里的服务器是本地的servAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); servAddr.sin_port=htons(5001);if(connect(connectSocket,(struct sockaddr*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)printf("连接错误\n");else{//连接成功,向服务器端发送数据::send(connectSocket,"xu chu liang -- twt thi plm",20,MSG_DONTROUTE); }//关闭套接字closesocket(connectSocket);WSACleanup();return 1;}。
Socket网络编程实验指导
实验七 Socket网络编程一、学时:4二、实验类型:设计性实验三、实验目的:1.熟悉VisualC++的基本操作。
2.基本了解基于对话框的windows应用程序的编写过程。
3.对于Windows Socket编程建立初步概念。
四、实验内容:利用Socket编写聊天程序。
五、实验原理:一、Windows Socket和套接口的基本概念套接口,就是一个指向传输提供者的句柄。
Win32中,套接口不同于文件描述符,所以它是一个独立的类型——SOCKET。
Windows Sockets描述定义了一个Microsoft Windows的网络编程界面,它是从Unix Socket 的基础上发展而来的,为Windows TCP/IP 提供了一个BSD型的套接字规范,除与Unix Sockets完全兼容外,还包括一个扩充文件,通过一组附加的 A PI实现Windows 式(即事件驱动)的编程风格;而Winsock则是在Microsoft Windows 中进行网络应用程序设计的接口。
Windows在Internet支配域中的TCP/IP协议定义了Winsock网络编程规范,融入了许多新特点。
使用Socket的目的是使用户在网络协议上工作而不必对该网络协议有非常深入的了解。
此外,编写的程序还可被迅速地移植到任何支持Socket的网络系统中去。
Winsock提供了一种可为指定传输协议打开、计算和关闭会话的能力。
在Windows下,TCP/IP上层模型在很大程度上与用户的Winsock应用有关;换言之,用户的Winsock应用控制了会话的方方面面,必要时,还会根据程序的需要格式化数据。
套接口有三种类型:流式套接口、数据报套接口及原始套接口。
流式套接口定义了一种可靠的面向连接的服务(利用TCP协议),实现了无差错无重复的顺序数据传输。
数据报套接口定义了一种无连接的服务(UDP 协议),数据通过相互独立的报文进行传输,是无序的,并且不保证可靠和无差错。
wsaconnect 例子
wsaconnect 例子题目:探索WSAConnect函数的使用方法及实例解析导言:在计算机网络中,socket编程是一种基础的网络通信方式,而WSAConnect函数是Windows操作系统中用于建立网络连接的函数之一。
本文将为读者详细介绍WSAConnect函数的使用方法,并通过举例分析,让大家更好地理解该函数的具体实现。
第一部分:WSAConnect函数概述WSAConnect函数是Windows Sockets API中用于建立网络连接的函数之一。
它具有以下特点:1. 功能:用于在客户端通过指定的本地套接字和服务器套接字参数建立网络连接。
2. 参数:需要传入套接字句柄、服务器地址信息以及服务器地址信息长度等参数。
3. 返回值:成功返回0,失败返回错误代码。
第二部分:使用方法详解1. 引入头文件:首先,我们需要引入Windows Sockets头文件,即#include <winsock2.h>。
2. 创建套接字:使用socket函数创建一个用于网络通信的套接字,并将其保存到一个变量中,如下方示例所示。
C++#include <winsock2.h>SOCKET sock;sock = socket(AF_INET, SOCK_STREAM, 0);3. 初始化结构体并填充服务器地址信息:定义sockaddr_in结构体类型变量以及服务器地址信息,包括服务器的IP地址和端口号。
并调用htons函数将端口号从主机字节序转换为网络字节序。
C++#include <winsock2.h>SOCKADDR_IN serverAddr;serverAddr.sin_addr.s_addr = inet_addr("192.168.1.1"); serverAddr.sin_family = AF_INET;serverAddr.sin_port = htons(1234);4. 使用WSAStartup函数初始化套接字库:在调用WSAConnect函数之前,需要先调用WSAStartup函数初始化套接字库,这是Windows Sockets API的必要步骤。
windows socket编程c语言
windows socket编程c语言Windows Socket编程是一种用于在Windows操作系统上进行网络通信的编程技术。
通过使用Windows Socket API,开发人员可以使用C语言来创建网络应用程序,实现网络通信的各种功能。
Windows Socket编程的主要目标是建立和管理网络连接。
它提供了一套函数和数据结构,用于创建和管理套接字(Socket),这是网络通信的基本单元。
套接字可以用于在客户端和服务器之间传输数据,可以是TCP套接字,也可以是UDP套接字。
在Windows Socket编程中,首先需要创建一个套接字。
套接字可以通过调用socket函数来创建,该函数接受三个参数:地址族(AF_INET或AF_INET6),套接字类型(SOCK_STREAM或SOCK_DGRAM)和协议(通常为0)。
创建套接字后,可以使用bind函数将套接字绑定到特定的IP地址和端口号。
一旦套接字被创建和绑定,就可以使用connect函数在客户端和服务器之间建立连接。
对于TCP套接字,可以使用listen函数开始监听连接请求,并使用accept函数接受客户端的连接。
对于UDP套接字,不需要建立连接,可以直接发送和接收数据。
一旦连接建立成功,就可以使用send和recv函数在套接字之间传输数据。
send函数用于将数据发送到远程主机,而recv函数用于接收远程主机发送的数据。
可以使用这两个函数进行双向通信,发送和接收数据。
Windows Socket编程还提供了一些其他的函数和数据结构,用于处理网络通信中的其他问题。
例如,可以使用getaddrinfo函数解析主机名和服务名,以获取对应的IP地址和端口号。
可以使用select函数在多个套接字之间进行多路复用,以实现并发处理。
可以使用ioctlsocket函数设置套接字的属性,例如非阻塞模式。
除了基本的网络通信功能,Windows Socket编程还支持一些高级功能,例如多线程和异步操作。
《网络编程》实验报告
一、实验目的1. 理解网络编程的基本原理和概念。
2. 掌握TCP/IP协议栈的基本工作原理。
3. 学习使用Socket编程实现网络通信。
4. 熟悉网络编程中的多线程编程技术。
5. 提高实际编程能力和问题解决能力。
二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发环境:Visual Studio 20194. 网络编程库:Winsock三、实验内容1. 网络编程基础2. Socket编程3. 多线程编程4. 客户端-服务器模式四、实验步骤1. 网络编程基础(1)了解网络编程的基本概念,如IP地址、端口号、协议等。
(2)学习TCP/IP协议栈的工作原理,包括OSI七层模型和TCP/IP四层模型。
2. Socket编程(1)学习Socket编程的基本原理,包括Socket创建、连接、发送、接收和关闭等操作。
(2)编写一个简单的TCP客户端程序,实现与服务器端的通信。
(3)编写一个简单的TCP服务器程序,接收客户端的连接请求,并实现数据交互。
3. 多线程编程(1)学习多线程编程的基本原理,了解线程、进程、并发和同步等概念。
(2)在客户端程序中添加多线程,实现同时与多个服务器进行通信。
(3)在服务器程序中添加多线程,实现同时处理多个客户端的连接请求。
4. 客户端-服务器模式(1)实现一个简单的文件传输客户端,实现文件的发送和接收。
(2)实现一个简单的文件传输服务器,接收客户端的文件传输请求,并完成文件传输。
五、实验结果与分析1. 网络编程基础通过学习网络编程基础,我们了解了网络编程的基本概念和TCP/IP协议栈的工作原理,为后续的Socket编程打下了基础。
2. Socket编程(1)通过编写TCP客户端程序,实现了与服务器端的通信,验证了Socket编程的基本原理。
(2)通过编写TCP服务器程序,接收客户端的连接请求,并实现了数据交互,进一步巩固了Socket编程的知识。
3. 多线程编程通过在客户端和服务器程序中添加多线程,实现了同时与多个服务器进行通信和同时处理多个客户端的连接请求,提高了程序的并发处理能力。
计算机网络socket编程实验报告
计算机网络socket编程实验报告
实验报告
黑龙江大学教务处
黑龙江大学计算机科学与技术专业、软件工程专业
《计算机网络》课程实验报告
学号20111913 姓名陈声晓班级1班
实验时间 4.16-4.30第1节-第2节
实验名称Socket通信
实验内容在一台计算机上实现两个程序的通信
一、实验目的
掌握Windows通信程序的编写,通信原理,实际编写通信程序,本试验是后续实验的基础。
做到在一台计算机上实现两个程序的通信。
二、实验环境
Windows xp/7
三、主要设计思想与算法
1.服务器创建socket,并规定通信的端口号(大于1024),等待客户端的连接。
2.客户端创建socket,通过端口号连接服务端。
3.客户端向服务端发送接收数据。
4.服务端接收发送数据。
5.通信结束,客户端和服务端关闭socket。
6.Socket通信流程:
四、实验结果(测试用例、实验结果)
五、实验总结
计算机网络通信利用java语言编写时,用到的技术室socket技术。
任何一个socket程序都至少包含客户端程序和服务端程序。
通过IP地址和端口号,实现了两台计算机之间的链接,然后才可以根据具体需要实现通信。
运行时先运行服务器程序,不难理解,客户端没有开放,就无法连接。
windows_socket_gethostbyname()
实验名称实验二Windows Sockets编程基础训练【实验目的】了解Windows Sockets API的基本函数功能,掌握Windows Sockets的编程环境配置,掌握网络程序设计的基本过程。
【实验要求】1、使用Windows Sockets的API函数获得本机的IP地址。
2、使用Windows Sockets的API函数获得给定域名的IP地址。
【实验作业】使用WinSock 2.2实现网络通信的功能,则需要引用头文件winsock2.h和库文件ws2_32.lib,代码如下:#include<winsock2.h>#pragma comment(lib, "ws2_32.lib")MSDN中关于gethostbyname函数的说明gethostname(host_name, 128)Host_name修改后的值MSDN中关于gethostbyname函数的说明pHost = gethostbyname(host_name);pHost修改后的值MSDN中关于hostent结构的说明struct in_addr addr;memcpy(&addr, pHost->h_addr_list[i], sizeof(struct in_addr));Addr第一次修改后的值MSDN中关于in_addr结构的说明inet_ntoa(addr)MSDN中关于inet_ntoa()函数的说明程序运行截图gethostbyname()takes a string like “”, and returns a struct hostent which contains tons of information, including the IP address.——Beej’s Guide to Network Programming Using Internet Socketsprintf("Host name is:");scanf("%s",host_name);pHost = gethostbyname(host_name);域名解析后pHost中的内容程序运行截图以下是程序代码:#include"stdafx.h"#include"winsock2.h"#pragma comment( lib, "ws2_32" )int _tmain(int argc, _TCHAR* argv[]) {char host_name[128];struct hostent * pHost; //The hostent structure is used by functions to store information about a given host WSADATA wsaData; //WSADATA结构体包含了系统所支持的winsock版本信息if(WSAStartup(MAKEWORD(2,2), &wsaData )!=0) {printf("WSAStartup失败");return 0;}printf("Host name is:");scanf("%s",host_name);pHost = gethostbyname(host_name);struct in_addr addr;memcpy(&addr, pHost->h_addr_list[0], sizeof(struct in_addr));printf("\nAddress : %s" , inet_ntoa(addr));if(WSACleanup()==SOCKET_ERROR) {printf("WSACleanup失败");}return 0;}。
WinSock网络编程
WinSock 网络编程1. 概述80's 初,ARPA(美国国防部高级研究计划局)®加利福尼亚大学Berkeley 分校提供资金,®开发在UNIX 下实现TCP/IP 协议。
®为TCP/IP 开发了一个API –– Socket 接口(套接口)–– 俗称Bekeley 套接口模型。
90's 初,Microsoft 等公司®基于Bekeley 套接口模型®制定了Windows Sockets 规范(简称WinSock)®已是TCP/IP 网络的标准。
1993.1,v1.1 1995.5,v2.0,增加了QOS (网络服务质量控制)2. WinSock 模型提供TCP/IP 传输层的接口:①TCP(传输控制协议)提供虚电路和面向连接的数据流传输服务。
实现无差错无重复的顺序数据传输。
Z D r i v e r eo n.c o m .②UDP(用户数据报协议)提供无连接的数据报传输服务。
数据通过相互独立的报文进行传输,是无序的,并且不保证可靠、无差错。
3. WinSock DLL·WinSock 与操作系统的关系动态链接库·动态链接库: 16位版:WINSOCK.DLL 32位版:WSOCK32.DLL①DLL 装载WinSock 服务由动态连接库WinSock DLL 提供,它完成WinSock 的初始化任务,协商WinSock 的版本支持,并分配必要的资源。
在使用WinSock API 之前,必须调用:· int WSAStartup(WORD v, (LPWSADATA)&WD)其中:v ––– 指示应用程序对WinSock 版本的要求, 低字节为主版本号,高字节为副版本号。
例:v1.1 ® v=Ox0101, v2.0 ® v=Ox0002,WD ––返回WinSock 的实现信息。
网络编程实训课程学习总结基于Socket的多人聊天室开发
网络编程实训课程学习总结基于Socket的多人聊天室开发在网络编程实训课程中,我学习了基于Socket的多人聊天室开发。
本文将总结我在学习过程中的收获和体会,并对实训课程进行一些反思和建议。
一、引言网络编程是现代计算机科学中非常重要的一个领域,它涉及到如何在不同的计算机之间进行通信和数据交换。
而Socket则是网络编程中常用的一种编程接口。
本次实训课程通过基于Socket的多人聊天室开发,使我们更加深入地了解了网络编程的原理和实践。
二、实训内容在实训课程中,我们首先学习了Socket编程的基本知识,包括Socket的建立、数据传输和断开等。
随后,我们开始实践基于Socket 的多人聊天室的开发。
通过分析需求,我们设计了聊天室的功能模块和用户界面,并使用Python编程语言进行开发。
三、学习收获1. 深入理解了网络编程的原理:通过实践,我更加深入地理解了网络编程的原理和过程。
我了解到Socket编程是通过TCP/IP协议栈实现的,而客户端和服务器之间的通信则是通过套接字(Socket)进行的。
2. 掌握了多线程编程:为了实现多个用户同时在线聊天的功能,我们采用了多线程编程的方式。
学习了线程的创建、管理和同步等技术,使得我们能够更好地实现多人聊天室。
3. 提升了团队协作能力:在开发聊天室的过程中,我们需要与团队成员紧密合作。
通过分工合作、协商解决问题等方式,我们体会到了团队协作的重要性,并在实践中逐渐提升了团队协作能力。
四、实训反思与建议在实训过程中,我发现了一些可以改进的地方,并提出了一些建议:1. 更加注重理论与实践结合:在学习网络编程的过程中,希望能够更加注重理论与实践的结合。
例如,在学习Socket编程的基本原理时,可以提供更多的实际案例进行演示。
2. 加强技术支持与指导:对于初学者而言,网络编程可能会遇到一些技术上的困难。
因此,希望在实训过程中能够加强技术支持与指导,及时解答学生的疑问。
3. 提供更多实际应用案例:除了多人聊天室的开发,希望在实训课程中能够提供更多实际应用案例。
记Windows下初次使用devC++进行socket编程过程
记Windows下初次使⽤devC++进⾏socket编程过程记初次接触socket编程,在devC++使⽤Winsock进⾏socket编程的⼀个过程,通过在devC++创建2个项⽬分别是server、client程序项⽬,感受通过socket使client与server的⼀次通讯。
1.新建项⽬与往常不同,不单单是需要创建⼀个C⽂件,更是要在连接库中添加 libws2_32在项⽬管理中的属性配置连接库,然后在项⽬中新建server.c⾯向连接的C/S程序⼯作流程(TCP)1. 使⽤WSAStartup()函数检查系统协议栈安装情况2. 使⽤socket()函数创建服务器端通信套接字3. 使⽤bind()函数将创建的套接字与服务器地址绑定4. 使⽤listen()函数使服务器套接字做好接收连接请求准备5. 使⽤accept()接收来⾃客户端由connect()函数发出的连接请6. 根据连接请求建⽴连接后,使⽤send()函数发送数据,或者使⽤recv()函数接收数据7. 使⽤closesocket()函数关闭套接字(可以先⽤shutdown()函数先关闭读写通道)8. 最后调⽤WSACleanup()函数结束Winsock Sockets APIserver代码:#pragma comment(lib,"ws2_32.lib")#include <Winsock2.h>#include <stdio.h>#include <stdlib.h>#define DEFAULT_PORT 5050 //服务端默认端⼝int main(int argc, char* argv[]){int iPort = DEFAULT_PORT;WSADATA wsaData;SOCKET sListen,sAccept;int iLen; //客户机地址长度int iSend; //发送数据长度char buf[] = "I am a server"; //要发送给客户的信息struct sockaddr_in ser,cli; //服务器和客户的地址if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0){printf("Failed to load Winsock.\n"); //Winsock 初始化错误return -1;}sListen = socket(AF_INET,SOCK_STREAM,0); //创建服务器端套接字if(sListen == INVALID_SOCKET){printf("socket() Failed: %d\n",WSAGetLastError());return -1;}//以下初始化服务器端地址ser.sin_family = AF_INET; //使⽤ IP 地址族ser.sin_port = htons(iPort); //主机序端⼝号转换为⽹络字节序端⼝号ser.sin_addr.s_addr = htonl(INADDR_ANY); //主机序 IP 地址转换为⽹络字节序主机地址//使⽤系统指定的 IP 地址 INADDR_ANYif(bind(sListen,(LPSOCKADDR)&ser,sizeof(ser)) == SOCKET_ERROR) //套接定与地址的绑定{printf("bind() Failed: %d\n",WSAGetLastError());return -1;}if(listen(sListen,5) == SOCKET_ERROR) //进⼊监听状态{printf("lisiten() Failed: %d\n",WSAGetLastError());return -1;}iLen = sizeof(cli); //初始化客户端地址长度参数while(1) //进⼊循环等待客户的连接请求{sAccept = accept(sListen,(struct sockaddr *)&cli,&iLen);if(sAccept == INVALID_SOCKET){printf("accept() Failed: %d\n",WSAGetLastError());return -1;}printf("Accepted client IP:[%s],port:[%d]\n",inet_ntoa(cli.sin_addr),ntohs(cli.sin_port));//输出客户端 IP 地址和端⼝号iSend = send(sAccept,buf,sizeof(buf),0); //给客户端发送信息if(iSend == SOCKET_ERROR) //错误处理{printf("send() Failed: %d\n",WSAGetLastError());break;}else if(iSend == 0){break;}else{printf("send() byte: %d\n",iSend); //输出发送成功字节数}closesocket(sAccept);}closesocket(sListen); //关闭 socketWSACleanup(); //输出发送成功字节数return0;}2.保存最后构建并运⾏这个项⽬,编译⽣成 server.exe。
c winsock示例
c winsock示例1. 简介Winsock是Windows操作系统中用于网络编程的API接口,它提供了一组函数和数据结构,使开发人员能够轻松地创建网络应用程序。
本文将介绍如何使用C语言编写一个基本的Winsock示例,帮助读者了解Winsock的基本概念和使用方法。
2. 准备工作在开始编写Winsock示例之前,我们需要准备一些必要的工作: - 安装合适的开发环境,如Visual Studio - 确保系统中已经安装了Winsock库文件,一般情况下Windows操作系统都已经自带了3. 创建Socket在使用Winsock进行网络编程时,首先需要创建一个Socket对象。
Socket是网络编程中的一个抽象概念,代表了一个网络连接的端点。
我们可以通过调用socket()函数来创建一个Socket对象,示例代码如下:#include <winsock2.h>int main() {// 初始化Winsock库WSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {printf("Failed to initialize winsock\n");return 1;}// 创建SocketSOCKET sock = socket(AF_INET, SOCK_STREAM, 0);if (sock == INVALID_SOCKET) {printf("Failed to create socket\n");WSACleanup();return 1;}// ...// 关闭Socketclosesocket(sock);// 清理Winsock库WSACleanup();return 0;}在上述代码中,我们首先调用WSAStartup()函数来初始化Winsock库。
基于VC++6.0 Socket编程操作实例
VC++6.0网络编程Socket编程作为一个初学者,深感Socket编程入门的困难,但当把一些问题弄懂之后,回过头来看以前遇到的一些问题,才发现Socket编程其实并没有那么复杂。
接下来我就把我遇到的一些困难讲述下,并补上解决的办法。
首先我们要想实现一个简单的点对点网络通信,就应该有一个客户和一个服务器我们先来做客户端。
先按照如下图所示建立好客户对话框模块:首先创建一个基于MFC AppWizard[EXE] 工程,工程名为Socket__002 (这里是以我的工程名为准,你们也可以自己命名工程。
)点击确定只收选择基本对话框,如图:点击下一步,在Windows Sockets[W]处钩上之后就点击【完成】。
建立如图所示的客户端对话框:控件属性:说明:IDC_EDIT1 端口号编辑框,IDC_EDIT3 发送文本框,IDC_IPADDRESS1 IPd 地址框,IDC_LIST1 列表框。
现在模块已经建好了,接下来就是写代码了,不过写代码之前我们要先理清思路。
客户端与服务器是怎样来实现通信的呢,其实就是由数据的发送者客户端将要发送的信息写入一个套接字,在通过中间环节传输到接收端服务器的套接字中,就可以由接收端的应用程序将套接字从中取出。
因此,两个应用程序间的数据传输要通过套接字来完成,至于两个套接字间是怎么传输的我们就不要管了,我们只要把信息装入套接字中就可以了。
作为一个客户端,应该具备以下功能:1,、向指定地址的服务器发送连接请求;2、向已经连接成功的服务器发送信息;3、主动断开与服务器的连接;当我们已经知道客户端的功能时就应该想到,我们该怎样用代码实现这些功能呢;当然对于初学者来说编写这些代码还有点困难,我们可以先参考网络上的资料把原理弄懂,这才是我写这篇文章的本意。
VC6.0界面中的工作区点击ClassView 选项卡,右击【Socket_002 classes】-----【NewClass】添加新类“Client_Socket”基类为generic CWnd。
winsock使用手册
winsock使用手册Winsock是Windows Socket的缩写,它是一种提供网络编程接口的技术,用于在Windows操作系统上进行网络通信。
本手册将介绍Winsock的基本概念、API函数和使用方法,帮助读者快速上手Winsock编程。
一、Winsock简介Winsock是Windows操作系统提供的一种网络编程接口,它允许开发人员创建基于TCP/IP协议的应用程序,并实现网络通信。
Winsock使用C语言提供了一组API函数,方便开发者进行网络编程。
二、Winsock的基本概念1. Socket在Winsock中,Socket是一个抽象概念,代表一个网络通信的端口。
开发者可以通过创建Socket建立与其他计算机的连接,并发送和接收数据。
2. 协议族Winsock支持多种协议族,常用的有AF_INET(用于互联网通信)和AF_INET6(用于IPv6通信)。
3. 协议类型协议类型定义了数据传输的特性,常见的协议类型有SOCK_STREAM(流式套接字,提供可靠的、面向连接的通信)和SOCK_DGRAM(数据报套接字,提供无连接的通信)。
4. IP地址与端口在Winsock中,IP地址用于标识网络上的计算机,端口用于标识一个应用程序,在计算机上可以同时运行多个应用程序,通过端口来区分不同的应用程序。
三、Winsock API函数1. WSAStartupWSAStartup函数用于初始化Winsock库,并指定所需的版本。
2. socketsocket函数用于创建一个套接字,返回一个套接字描述符。
3. bindbind函数用于将一个套接字与特定的IP地址和端口绑定。
4. listenlisten函数用于使一个套接字进入监听状态,等待客户端的连接。
5. acceptaccept函数用于接受客户端的连接请求,并创建一个新的套接字用于与客户端进行通信。
6. connectconnect函数用于与服务器建立连接。
Windows下C语言的Socket编程例子(TCP和UDP)
Windows下C语⾔的Socket编程例⼦(TCP和UDP)⼀。
<TCP>server端:1 #include "stdafx.h"2 #include <stdio.h>3 #include <winsock2.h>45#pragma comment(lib,"ws2_32.lib")67int main(int argc, char* argv[])8 {9//初始化WSA10 WORD sockVersion = MAKEWORD(2,2);11 WSADATA wsaData;12if(WSAStartup(sockVersion, &wsaData)!=0)13 {14return0;15 }1617//创建套接字18 SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);19if(slisten == INVALID_SOCKET)20 {21 printf("socket error !");22return0;23 }2425//绑定IP和端⼝26 sockaddr_in sin;27 sin.sin_family = AF_INET;28 sin.sin_port = htons(8888);29 sin.sin_addr.S_un.S_addr = INADDR_ANY;30if(bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)31 {32 printf("bind error !");33 }3435//开始监听36if(listen(slisten, 5) == SOCKET_ERROR)37 {38 printf("listen error !");39return0;40 }4142//循环接收数据43 SOCKET sClient;44 sockaddr_in remoteAddr;45int nAddrlen = sizeof(remoteAddr);46char revData[255];47while (true)48 {49 printf("等待连接...\n");50 sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen);51if(sClient == INVALID_SOCKET)52 {53 printf("accept error !");54continue;55 }56 printf("接受到⼀个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));5758//接收数据59int ret = recv(sClient, revData, 255, 0);60if(ret > 0)61 {62 revData[ret] = 0x00;63 printf(revData);64 }6566//发送数据67char * sendData = "你好,TCP客户端!\n";68 send(sClient, sendData, strlen(sendData), 0);69 closesocket(sClient);70 }7172 closesocket(slisten);73 WSACleanup();74return0;75 }client端:1 #include "stdafx.h"2 #include <WINSOCK2.H>3 #include <STDIO.H>45#pragma comment(lib,"ws2_32.lib")678int main(int argc, char* argv[])9 {10 WORD sockVersion = MAKEWORD(2,2);11 WSADATA data;12if(WSAStartup(sockVersion, &data) != 0)13 {14return0;15 }1617 SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);18if(sclient == INVALID_SOCKET)19 {20 printf("invalid socket !");21return0;22 }2324 sockaddr_in serAddr;25 serAddr.sin_family = AF_INET;26 serAddr.sin_port = htons(8888);27 serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");28if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)29 {30 printf("connect error !");31 closesocket(sclient);32return0;33 }34char * sendData = "你好,TCP服务端,我是客户端!\n";35 send(sclient, sendData, strlen(sendData), 0);3637char recData[255];38int ret = recv(sclient, recData, 255, 0);39if(ret > 0)40 {41 recData[ret] = 0x00;42 printf(recData);43 }44 closesocket(sclient);45 WSACleanup();46return0;47 }⼆. <UDP>SERVER 端1 #include "stdafx.h"2 #include <stdio.h>3 #include <winsock2.h>45#pragma comment(lib, "ws2_32.lib")67int main(int argc, char* argv[])8 {9 WSADATA wsaData;10 WORD sockVersion = MAKEWORD(2,2);11if(WSAStartup(sockVersion, &wsaData) != 0)12 {13return0;14 }1516 SOCKET serSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);17if(serSocket == INVALID_SOCKET)18 {19 printf("socket error !");20return0;21 }2223 sockaddr_in serAddr;24 serAddr.sin_family = AF_INET;25 serAddr.sin_port = htons(8888);26 serAddr.sin_addr.S_un.S_addr = INADDR_ANY;27if(bind(serSocket, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)28 {29 printf("bind error !");30 closesocket(serSocket);31return0;32 }3334 sockaddr_in remoteAddr;35int nAddrLen = sizeof(remoteAddr);36while (true)37 {38char recvData[255];39int ret = recvfrom(serSocket, recvData, 255, 0, (sockaddr *)&remoteAddr, &nAddrLen);40if (ret > 0)41 {42 recvData[ret] = 0x00;43 printf("接受到⼀个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));44 printf(recvData);45 }4647char * sendData = "⼀个来⾃服务端的UDP数据包\n";48 sendto(serSocket, sendData, strlen(sendData), 0, (sockaddr *)&remoteAddr, nAddrLen); 4950 }51 closesocket(serSocket);52 WSACleanup();53return0;54 }CLIENT 端1 #include "stdafx.h"2 #include <stdio.h>3 #include <winsock2.h>45#pragma comment(lib, "ws2_32.lib")67int main(int argc, char* argv[])8 {9 WORD socketVersion = MAKEWORD(2,2);10 WSADATA wsaData;11if(WSAStartup(socketVersion, &wsaData) != 0)12 {13return0;14 }15 SOCKET sclient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);1617 sockaddr_in sin;18 sin.sin_family = AF_INET;19 sin.sin_port = htons(8888);20 sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");21int len = sizeof(sin);2223char * sendData = "来⾃客户端的数据包.\n";24 sendto(sclient, sendData, strlen(sendData), 0, (sockaddr *)&sin, len);2526char recvData[255];27int ret = recvfrom(sclient, recvData, 255, 0, (sockaddr *)&sin, &len);28if(ret > 0)29 {30 recvData[ret] = 0x00;31 printf(recvData);32 }3334 closesocket(sclient);35 WSACleanup();36return0;37 }本⽂来⾄:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
以下所有内容皆针对于 AF_INET 协议所言 协议簇常值 协议簇 AF_INET AF_IPX AF_NETBIOS AF_APPLETALK AF_TAM AF_IRDA Type : 网际协议 IPX/SPX 协议 NetBIOS 协议 AppleTalk ATM Infrared Sockets 注释
windows socket 编程实战
Socket 中一个比较重要的结构体: hostent,应该用好这个结构体。只允许复制应用程序
一个备份,不允许应用程序自己修改,只能由系统修改,在调用任何 socket 结构之前,都应 该 copy 自 己需 要的 信 息。 通讯 编 程详 见 MSDN 中 Windows CE document->Application Develop->Communication Services->Windows Sockets 章节。
bind(s,(SOCKADDR*)&localaddr,sizeof(localaddr));
4 建立套接字连接——connect()和 WSAConnect()
函数原型:
int connect( SOCKET s, const struct sockaddr FAR *name, int namelen ) 参数说明: s: 上面连接服务器的套接字
WSADATA , FAR* LPWSADATA ; 则一个程序要使用 1.2 版本的 WinSock ,程序为: #include "afxsock.h" WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 2, 2 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) { AfxMessageBox("socket 初始化失败!"); return; } if ( LOBYTE( wsaData.wVersion ) != 2 ||HIBYTE( wsaData.wVersion ) != 2 )
如果成功的与服务器建立连接,connect函数返回0,否则返回SOCKET_ERROR 错误.
5 监听连接——listen()
指示一个套接字等候进入连接,listen仅仅被TCP服务器调用。当函数Socket创建一个套 接字时,它被假设一个主动套接字,即它是一个将调用connect发起连接的客户套接字, 函数listen将未连接的套接字转换为被动套接字, 指示内核应接收指向此套接字的连接请 求。此时套接字将从CLOSED状态转换到LISTEN 状态,套接字进入监听模式。函数原 型为:
name : 一个指向 struct sockaddr 类型的缓冲区的指针, 调用connect 前, 必须对其进行缓冲。 namelen : name 参数所指的缓冲区的长度,可用 sizeof 函数取得。
WSAConnect()为 connect 的 WinSock2 版本: int WSAConnect( SOCKET s, const struct sockaddr FAR *name, int namelen, LPWSABUF
ห้องสมุดไป่ตู้
{ WSACleanup( ); AfxMessageBox("socket 创建版本错误!"); return; }
各 windows 平台支持的 WinSock 最新版本 平台 Win95 Win98 NT4.0 Win2000 Win CE 使用完 WinSock 释放所使用的资料: int WSACleanup(void); 示例代码: WSACleanup(); //成功返回 0 ,否则返回 SOCKET_ERROR 1.1 2.2 2.2 2.2 1.1 WinSock 版本
: 指向一个 struct sockaddr类型的缓冲区,用来接收连接方的地,可以置NULL 。 : 整形指针,在调用时它所指的空间存放addr指向的缓冲区长度。在调用返回
后,里面是返回的连接方的地址的确切长度。如果我们对客户的身份不想知道,则可将 addr和 addrlen 参数置NULL. 例如:newsock=accept(s,NULL,NULL); 如果调用成功,则accept返回一个由内核生成的全新的套接字,注意,这个套接字和原来的 bind 的套接字不为同一个,即,一端至少得两个套接字,一个套接字为windows套接字,由 socket 创建,负责绑定,监听,一个为 C/S 间通讯的套接字,代表与客户机的连接,由accept创建,而 原来的套接字状态不变,仍处于监听状态,等待客户的连接请求。如果调用失败,则返回一个 INVALID_SOCKET 的错误。
使用如下代码为一个已创建的套接字绑定地址: SOCKET s; Struct sockaddr_in localaddr;
s=socket(AF_INET,SOCK_STREAM,0); localaddr.sin_family=AF_INET ;
localaddr.sin_port=htons(5555); localaddr.sin_addr.s_addr=htonl(INADDR_ANY); //自动选取本地地址进行填充
套接字的类型,常值。下列为 AF_INET 协议簇支持的套接字类型:
AF _INET 协议簇支持的套接字类型 套接字类型 SOCK_STREAM SOCK_DGRA M SOCK_RAW 注释 字节流套接字 数据报套接字 原始套接字 所用的通信协议 TCP 协议 UDP 协议 ICMP ,IGMP 等协议, 此 时 protocol 参数 需进行 设置 例如创建一个 TCP 套接字: s=Socket(AF_INET , SOCK_STREAM , 0 ) ;
过 MAKEWORD(X , Y )宏指定, X 为低位, Y 为高位。 例: wVersionRequested =MAKEWORD(1,2); lpWSAData Typedef struct WSAData { WORD WORD wVersion; wHighVersion; //设置成准备使用的 WinSock 版本 //存放的是现有的 WinSock 库的最高版本, 与 wVersionRequested 参数相同 char char unsigned short unsigned short char FAR * } szDescription[WSADESCRIPTION_LEN+1]; szSystemStatus[WSASYSSTATUS_LEN+1]; iMaxSockets; iMaxUdpDg; lpVendorInfo; : 接收 WinSock 实现细节的 LPWSADATA 结构。
int listen( SOCKET s, int backlog ); 参数说明: s : 要监听的已绑定但却没有连接的套接字
backlog
:
内核为此套接字排队的最大连接个数,通过指定backlog 值我们可以对同时可
处理的连接数进行限制,多于则被丢弃。基层协议本身对backlog 有最大限制,如果设定大于它 则被用最接近的合法数值代替。 调用成功则返回0 ,不成功则返回SOCKET_ERROR错误。 Listen()通常在bind() 之后,accept之前调用,如下:( 省略了错误检测代码) bind(s,(SOCKADDR*)&localaddr,sizeof(localaddr)); listen(s,5); accept(...);
1 winsock 的启动和终止——WSAStartup():
使用 winsock 之前,必须对其进行初始化 (VC 中项目创建时不包括 socket 的时候 ),将其加 载,否则,将返回 SOCKET_ERROR 错误,错误信息为 WSANOTINITIALIZED 。 用 WSAStartup 函数可加载 WinSock 库 函数声明: int WSAStartup(WORD wVersionRequested , LPWSADATA lpWSAData); //成功返 0,否则返非 0 参数说明: wVersionRequested : WinSock 库的版本号,高位指定副版本,低位指定主版本,可通
lpCallerData, LPWSABUF lpCalleeData, LPQOS lpSQOS, LPQOS lpGQOS ); 调用方法与 connect类似。 使用如下代码与地址为03.03.03.1 ,端口为5555 的TCP 服务器建立联系: SOCKET s; struct sockaddr_in remoteaddr;
2 创建套接字——Socket()和 WSASocket()
网络通信必须得创建套接字,创建一个套接字,使用下面的函数: SOCKET Socket(int af ,int type,int protocol); 或者: SOCKET WSASocket(int af,int type,int protocol,LPWSAPROTOCOL_INFO
3 指定本机地址——bind()
创建套接字后: 服务器端:必须将其绑定到一个已知地址 客户端 :不必绑定,内核会为其选择地址。
Int bind(SOCKET s , const struct sockaddr FAR* name , int namelen) 参数说明: s name 填充。 内容为本地地址信息。Sockaddr 结构体定义: struct sockaddr{ u_short char }; 常使用的是另一种结构体类型的 Socket 地址类型 sockaddr_in : struct sockaddr_in { short u_short struct char }; namelen : name 参数所指的缓冲区的长度,可用 sizeof 函数取得。 in_addr sin_family; sin_port; sin_addr; sin_zero[8]; //协议簇,必为AF_INET //端口号,使用前应用htons函数转换。 //IP地址,使用前应用 htonl函数转换 sa_family; sa_data[14]; : : 等待客户进行连接的套接字 指向 struct sockaddr 类型的缓冲区的指针,在调用 bind 前,必须先对其进行