基于C语言的Socket编程服务器端测试代码
- 格式:doc
- 大小:15.50 KB
- 文档页数:2
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; }。
windows tcp编程 c语言在Windows上进行TCP编程主要使用Winsock库。
以下是一个简单的TCP服务器和客户端的例子,使用C语言在Windows上编程。
首先,我们需要包含必要的头文件,并初始化Winsock库:```cinclude <>include <>pragma comment(lib, "ws2_")int main() {WSADATA wsaData;WSAStartup(MAKEWORD(2, 2), &wsaData);// ...}```TCP服务器:服务器端首先需要创建一个socket,然后绑定到一个特定的地址和端口,然后开始监听。
当一个客户端尝试连接时,服务器接受这个连接,然后就可以发送和接收数据了。
```cSOCKET serverSocket = socket(AF_INET, SOCK_STREAM, 0); SOCKADDR_IN serverAddr;_family = AF_INET;_port = htons(8080);___addr = INADDR_ANY;bind(serverSocket, (SOCKADDR)&serverAddr, sizeof(serverAddr)); listen(serverSocket, 5);```接受客户端的连接:```cSOCKADDR_IN clientAddr;int clientSize = sizeof(clientAddr);SOCKET clientSocket = accept(serverSocket,(SOCKADDR)&clientAddr, &clientSize);```然后就可以通过clientSocket来发送和接收数据了。
TCP客户端:客户端首先需要创建一个socket,然后连接到服务器。
然后就可以发送和接收数据了。
C++编写的WebSocket服务端客户端实现⽰例代码⽬录使⽤过标准的libwebsockets服务端库测试过,主要是短⼩精悍,相对于libwebsockets不需要依赖zlib和openssl 以及其他库,直接make就可以使⽤了,linux跟windows都可以使⽤。
测试⽤例:#include "easywsclient.hpp"#include <assert.h>#include <stdio.h>#include <string>using easywsclient::WebSocket;static WebSocket::pointer ws = NULL;void handle_message(const std::string & message){printf(">>> %s\n", message.c_str());if (message == "world") { ws->close(); }}int main(){ws = WebSocket::from_url("ws://localhost:8126/foo");assert(ws);//判断ws对象是否为空nullws->send("goodbye");ws->send("hello");//如果你需要多线程,可以在⼀个thread 维护该ws的连接重连机制while (ws->getReadyState() != WebSocket::CLOSED) //判断ws是否正常连接{ws->poll();//这个必须要调⽤,否则不能发送,发送跟接收都是异步的,都是在这个poll函数⾥监测处理的ws->dispatch(handle_message);}delete ws;return 0;}//线程thread 维护重连连接void run(){bool conn = FLASE;ws = WebSocket::from_url("ws://localhost:8126/foo");//如果你需要多线程,可以在⼀个thread 维护该ws的连接重连机制while (1) //判断ws是否正常连接{if(ws != NULL){ws->poll(0);//这个必须要调⽤,否则不能发送,发送跟接收都是异步的,都是在这个poll函数⾥监测处理的ws->dispatch(handle_message);if(ws->getReadyState() == WebSocket::CLOSED){//ws连接断开重连delete ws;ws = NULL;ws = WebSocket::from_url("ws://localhost:8126/foo");}else if(wss->getReadyState()== WebSocket::OPEN){//ws连接ok// ws->send("goodbye");ws->send("hello");}}else{ws = WebSocket::from_url("ws://localhost:8126/foo");sleep(1);}if(ws!=NULL)delete ws;}有细⼼的朋友发现在发送中⽂GBK 的时候与服务端会断开//GBK -> UTF-8//遇到发送的字符串⾥有中⽂的话需要send 前进⾏转换⼀下,//这个是⽹友提供的在windows下的转换函数std::string Server_Stream::GBKToUTF8(const std::string& strGBK){std::string strOutUTF8 = "";WCHAR * str1;int n = MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, NULL, 0);str1 = new WCHAR[n];MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, str1, n);n = WideCharToMultiByte(CP_UTF8, 0, str1, -1, NULL, 0, NULL, NULL);char * str2 = new char[n];WideCharToMultiByte(CP_UTF8, 0, str1, -1, str2, n, NULL, NULL);strOutUTF8 = str2;delete[]str1;str1 = NULL;delete[]str2;str2 = NULL;return strOutUTF8;}下⾯是C++实现的WebSocket客户端,写好后这⾥记⼀下,免得以后忘记。
基于Linux的C语言Socket多线程网络端口压力测试程序网络压力测试连接安全探测第一步是发起多个线程同时连接一个端口,作为老司机,这里提供一套简单的多线程Socket连接压力测试程序,通过发起多个连接,来判断服务器响应能力。
可以指定多个线程同时连接,代码基于Linux下编译并运行成功,如下(文件名scan.c):1.#include2.#include3.#include4.#include5.#include6.#include7.#include8.#include9.#include10.#include11.#include12.#include13.#include14.char strIP[20];15.int nPort=0;16.int nThreadNum=0;17.int nThreadCurNum=0;18.19.void* ProcessThreadProc(void *pPara)20.{21.struct sockaddr_in serverAddr;22.int clientSocket;23.char sendbuf[200];24.char recvbuf[200];25.if((clientSocket=socket(AF_INET,SOCK_STREAM,0)) < 0 )26.{27.nThreadCurNum--;28.perror( 'socket error' );29.return NULL;30.}31.32.serverAddr.sin_family=AF_INET;33.serverAddr.sin_port=htons(nPort);34.serverAddr.sin_addr.s_addr=inet_addr(strIP);35.if(connect(clientSocket,( struct sockaddr * )&serverAddr,sizeof(serverAddr)) < 0)36.{37.nThreadCurNum--;38.perror( 'Connect error' );39.return NULL;40.}41.printf('Connect with destination host OK .....\n');42.while(1)43.{44.sleep(1);45.}46.close(clientSocket);47.nThreadCurNum--;48.return NULL;49.}50.main()51.{52.int i = 0;53.int nFlag = 0;54.int nSuccessNum = 0;55.printf('Input IP:>');56.scanf('%s',strIP);57.printf('%s\n',strIP);58.printf('Input Max Port:>');59.scanf('%d',&nPort);60.printf('%d\n',nPort);61.printf('Input Thread NuM:>');62.scanf('%d',&nThreadNum);63.printf('%d\n',nThreadNum);64.nThreadCurNum = nThreadNum;65.66.for(i=0; i < nThreadNum; i++)67.{68.pthread_t num;69.nFlag = pthread_create(&num, NULL, ProcessThreadProc, (void *)i);70.if(nFlag != 0)71.{72.printf('Error: Thead Error [%d]....\n',i);73.nThreadCurNum--;74.}75.else76.nSuccessNum++;77.}78.printf('Success Num: %d Failed Num: %d \n',nSuccessNum,nThreadNum-nSuccessNum);79.80.while(true)81.{82.printf('Current Num: %d\n',nThreadCurNum);83.sleep(2);84.}85.return 0;86.}通过gcc编译,编译时注意加上-lpthread gcc -o scan scan.c -lpthread,然后运行即可。
网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。
Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。
什么是SocketSocket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。
要学Internet上的TCP/IP网络编程,必须理解Socket接口。
Socket接口设计者最先是将接口放在Unix操作系统里面的。
如果了解Unix系统的输入和输出的话,就很容易了解Socket了。
网络的 Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。
Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。
常用的Socket类型有两种:流式Socket (SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。
流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。
Socket建立为了建立Socket,程序可以调用Socket函数,该函数返回一个类似于文件描述符的句柄。
socket函数原型为:int socket(int domain, int type, int protocol);domain指明所使用的协议族,通常为PF_INET,表示互联网协议族(TCP/IP协议族);type参数指定socket的类型: SOCK_STREAM 或SOCK_DGRAM,Socket 接口还定义了原始Socket(SOCK_RAW),允许程序使用低层协议;protocol通常赋值 "0"。
socket编程c语言Socket编程是一种网络编程的方法,它通过使用TCP/IP协议栈,允许计算机上的不同进程之间进行通信。
在C语言中,我们可以使用socket库来实现这种网络编程。
Socket是一种抽象层,它提供了一种机制,可以将网络通信抽象为输入输出流。
通过Socket编程,我们可以建立网络连接,并通过网络发送和接收数据。
Socket编程主要涉及两种类型的Socket,即服务器Socket和客户端Socket。
服务器Socket用于监听并接受来自客户端的连接请求,而客户端Socket用于向服务器发送连接请求。
在C语言中,创建一个Socket可以通过调用socket()函数来实现。
这个函数接受三个参数:地址族(AF_INET表示使用IPv4地址)、套接字类型(SOCK_STREAM表示使用TCP协议)、以及协议类型(通常为0,表示让系统自动选择合适的协议)。
创建Socket后,我们可以通过调用bind()函数将Socket与一个特定的IP地址和端口号绑定在一起。
然后,调用listen()函数将Socket置于监听状态,等待客户端的连接请求。
如果有客户端发送连接请求,服务器Socket会接受这个请求,并返回一个新的Socket,用于与该客户端进行通信。
然后,服务器可以通过调用accept()函数来接受这个连接请求。
accept()函数会返回一个新的Socket,用于与客户端进行通信。
客户端Socket可以通过调用connect()函数与服务器建立连接。
这个函数接受服务器的IP地址和端口号作为参数。
如果连接成功,客户端Socket就可以像与服务器直接通信一样,发送和接收数据。
通过Socket编程,我们可以实现各种各样的网络应用。
例如,我们可以实现一个Web服务器,用于提供网页和处理HTTP请求。
我们也可以实现一个聊天程序,用于实时聊天。
此外,还可以通过Socket编程实现其他各种网络服务,如FTP、SMTP、POP3等。
SOCKET编程(C语言实现)
一、简介
SOCKET编程可以理解为IP地址和端口的组合,它是一种网络编程的
基础,可以用来实现不同计算机之间的计算机程序通信。
它有两种特点:1.使用TCP/IP协议进行连接;2.能够支持多用户客户端/服务器编程。
使用SOCKET编程实现的网络通信,其基本流程是:客户端向服务器
发起连接,服务器接受客户端的连接请求并响应,双方建立连接后,客户
端发送数据,服务器接受客户端的数据并做出响应,最后双方断开连接。
二、开发环境
SOCKET编程是用C语言编写的,所以需要使用C语言编译器进行编译。
常用的C语言开发环境有:Visual Studio、Xcode、Eclipse等。
Xcode和Eclipse比较适合用来开发Mac版本的SOCKET程序,但Windows
版本的SOCKET程序需要使用Visual Studio开发。
使用Visual Studio开发SOCKET编程,需要引入WinSock2.h和
WS2_32.dll库,打开工程属性->调试->编译器->预处理器->预处理器定义,增加 WIN32 和 _WINSOCK_DEPRECATED_NO_WARNINGS变量,这样就可
以在工程中应用Winsock2.h库了。
三、编程实现
1. 创建Socket
在SOCKET编程中,每台主机都必须有一个唯一的IP地址,然后客户
端和服务器之间必须建立连接。
创建Socket时,需要调用socket(函数,函数头如下:
// 创建socket。
c socket 编程C语言中使用Socket编程可以实现网络通信,主要针对TCP和UDP两种协议。
下面是C Socket编程的相关参考内容。
1. 应用层通信模型:- 客户端/服务器模型:客户端向服务器发送请求,服务器接收请求并发送回复。
- 对等通信模型:两个或多个进程之间直接通信,不需要中间服务器。
2. Socket编程流程:- 创建Socket:使用`socket()`函数创建一个Socket。
- 绑定Socket:使用`bind()`函数将Socket绑定到一个特定的地址和端口号。
- 监听连接请求:对于服务器端,使用`listen()`函数监听连接请求。
- 接收连接请求:对于服务器端,使用`accept()`函数接收连接请求。
- 建立连接:对于客户端,使用`connect()`函数连接到服务器。
- 发送和接收数据:使用`send()`和`recv()`函数发送和接收数据。
- 关闭连接:使用`close()`函数关闭Socket连接。
3. TCP Socket编程:- 创建Socket:使用`socket(AF_INET, SOCK_STREAM, 0)`函数创建TCP Socket。
- 绑定Socket:使用`bind()`函数将Socket绑定到服务器的地址和端口号。
- 监听连接请求:使用`listen()`函数开始监听连接请求。
- 接收连接请求:使用`accept()`函数接收来自客户端的连接请求,并创建一个新的Socket用于通信。
- 建立连接:使用`connect()`函数连接到服务器的地址和端口号。
- 发送和接收数据:使用`send()`和`recv()`函数发送和接收数据。
- 关闭连接:使用`close()`函数关闭Socket连接。
4. UDP Socket编程:- 创建Socket:使用`socket(AF_INET, SOCK_DGRAM, 0)`函数创建UDP Socket。
C#的Socket编程文档C#的Socket编程文档一. Socket编程基础1. Socket网络套接字(Socket)是基于TCP/IP协议的程序实现协议。
实际上,我们所有的网络编程都是基于Socket而实现的。
Socket在UNIX和Windows甚至Linux上都得到很好的支持(而且此三种操作系统之间的数据通信也是通过Socket编程来实现的),所以,我们通常把基于TCP/IP协议的网络编程称之为Socket的程序实现。
1) SocketSocket的中文翻译是套接字。
它是网络通信的基本构件。
Socket是可以被命名和寻址的通信端口。
使用中的每个Socket都有其对应的类型和一个与之相连的进程(线程)2) TCP和UDP面向连接的操作使用TCP协议,这个模式下的Socket必须在发送数据之前与目的地的Socket取得一个连接,一旦连接建立了,Sockets就可以通过一个数据流接口,发送或者接收信息。
所有的发送的信息都会在另一端以同样的顺序被接收。
面向连接的TCP协议比无连接的UDP协议执行的效率更低,但是数据的安全性、可靠性得到保障。
无连接的操作使用UDP数据报协议。
数据报,顾名思义,就像是报纸的投递一样。
是一个单向的数据发送操作。
一个数据报是一个独立的单元,它包含了所有的这次消息发送的所有信息。
有目的地址和要发送的内容,这个模式下的Socket不需要与一个目的Socket 建立连接,它只是简单的投出数据报。
无连接的操作是快速和高效的。
2. TCP和UDP协议的比较与介绍Socket有两种主要的操作方式:面向连接的TCP协议和无连接的UDP协议。
面向连接的Sockets操作必须建立一个连接才能进行通信。
在这个连接中传递的所有数据是有序的,而且遵循先进先出的原则。
无连接的Sockets操作就像是一个邮件投递,数据投递过程中的安全性没有什么保证,而且多个数据包在到达时的顺序可能与出发时的顺序不一样。