基于C++的socket通信实例

合集下载

C++实例(简单的Windows套接字(Socket)例子)

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; }。

C语言实现无线通信技术

C语言实现无线通信技术

C语言实现无线通信技术无线通信技术在现代社会中起着至关重要的作用,它使人们能够随时随地进行信息传递和交流。

C语言作为一种广泛应用于嵌入式系统和通信领域的编程语言,可以用于实现无线通信技术。

本文将重点介绍C语言在无线通信中的应用,并探讨其实现原理和一些常用技术。

一、C语言与无线通信的基础知识无线通信是通过无线传输介质进行信息传递的技术,它基于电磁波的传输原理。

而C语言作为一种高级编程语言,具有易学易用、功能丰富等特点,可以用于编写控制无线通信模块的程序。

下面将分别介绍C语言的一些基础知识和无线通信的原理。

1. C语言基础知识C语言是一种结构化的、面向过程的计算机编程语言,它使用简洁的语法和强大的功能,方便程序员进行开发和调试。

C语言具有高效的执行速度和良好的可移植性,因此被广泛应用于各个领域。

在无线通信领域,C语言可以用于编写无线通信设备的驱动程序、通信协议的实现等。

2. 无线通信原理无线通信基于电磁波的传输原理,它通过调制、解调等技术实现信息的传递。

其中,调制是将要传输的信息信号转换为与载波频率相比较低的高频信号,解调则是将接收到的高频信号转换为原始信息信号。

常见的无线通信技术包括蓝牙、Wi-Fi、NFC等。

二、C语言在无线通信中的应用C语言在无线通信技术中具有广泛的应用,它可以用于编写无线通信设备的控制程序、通信协议的实现等。

下面将介绍C语言在无线通信中的几个常见应用。

1. 驱动程序编写无线通信设备通常需要通过驱动程序与计算机进行交互。

C语言可以用于编写无线通信设备的驱动程序,实现设备与计算机的数据传输和控制。

驱动程序通常需要调用操作系统提供的函数库和驱动接口,使用C语言可以方便地实现这一功能。

2. 通信协议实现无线通信设备之间的通信依赖于通信协议的实现。

C语言可以用于编写无线通信设备的通信协议,实现设备之间的数据交换和通信功能。

通信协议通常需要处理数据的封装、解封装、差错检测等操作,使用C语言可以比较方便地完成这些任务。

c语言socket函数

c语言socket函数

c语言socket函数Socket函数是在网络编程中非常重要的一部分,它提供了一种能够在网络上进行通信的机制。

在C语言中,Socket函数库提供了一组函数,用于创建、绑定、连接、接受和发送套接字等操作。

1.创建套接字:- socket(函数用于创建一个套接字,它接收三个参数:协议族(如AF_INET表示IPv4协议族)、套接字类型(如SOCK_STREAM表示面向连接的流式套接字)和协议(通常为0)。

- 示例:int sockfd = socket(AF_INET, SOCK_STREAM, 0);2.绑定套接字:- bind(函数用于将创建的套接字与指定的地址和端口绑定,以便在网络上监听和接收数据。

- 示例:struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(8080);addr.sin_addr.s_addr = htonl(INADDR_ANY);bind(sockfd, (struct sockaddr *)&addr, sizeof(addr));3.监听套接字:- listen(函数用于将套接字设置为监听模式,用于接收来自网络的连接请求。

- 示例:listen(sockfd, 5);4.接受连接:- accept(函数用于接受客户端的连接请求,并返回一个新的套接字用于与客户端进行通信。

- 示例:int newsockfd = accept(sockfd, (struct sockaddr *)&addr, sizeof(addr));5.连接服务器:- connect(函数用于向服务器发送连接请求,并与服务器建立通信。

- 示例:struct sockaddr_in serv_addr;serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(8080);serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");connect(sockfd, (struct sockaddr *)&serv_addr,sizeof(serv_addr));6.发送和接收数据:- send(函数用于发送数据到已连接的套接字。

C语言基于socket的文件传输(可循环发送多个文件)

C语言基于socket的文件传输(可循环发送多个文件)

C语⾔基于socket的⽂件传输(可循环发送多个⽂件)基本简介:本次⽂件传输的实现主要是通过客户端向服务器发送下载请求,然后在服务器中找到对应的⽂件并打开⽂件,再继续向客户端传送⽂件,⽽客户端就在不停的接收。

这是因为⽂件可能⽐较⼤,⼀个缓冲数组只能保存⼀部分⽂件内容,因此服务器得不断从⽂件中读取内容并发给客户端,⽽客户端得不停的循环接收。

但是在事先,得将相应要发送的⽂件(照⽚,⾳频,视频等)保存在服务器相应的⽬录下。

⽽这个是不符合实际要求的,通常来讲,是应该将客户端1的⽂件发送给客户端2,⽽服务器仅仅只是起到⼀个中转站的作⽤,即⽂件应该事先保存在客户端1下。

这⾥我们只是完成⽂件传输的相应功能就⾏了,就不在计较这些啦。

因为只要你理解了这⼀块,可以根据⾃⼰的实际需要,在进⾏修改。

具体编译:gcc server.c -o server -lpthread //这是因为在服务器中加⼊了线程函数,所以编译的时候需要加上 -lpthread 。

gcc client.c -o client记住⼀定要先运⾏服务器,在运⾏客户端。

在客户端运⾏的时候回提醒你输⼊服务器对应的pc ip,如实输⼊就⾏啦。

如果是在本机pc上进⾏测试的话,也可以输⼊0.0.0.0 。

server.c:#include <stdio.h>#include <netdb.h>#include <sys/socket.h>#include <arpa/inet.h>#include <sys/types.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include <fcntl.h>#include <netinet/in.h>#include <pthread.h>#define portnum 12345#define FILE_SIZE 500#define BUFFER_SIZE 1024void *net_thread(void * fd);int main(){//初始化套接字int server_fd=socket(AF_INET,SOCK_STREAM,0);if(-1==server_fd){perror("socket");exit(1);}//绑定端⼝和ip;struct sockaddr_in server_addr; //struct sockaddr_in为结构体类型,server_addr为定义的结构体server_addr.sin_family=AF_INET; //Internet地址族=AF_INET(IPv4协议)server_addr.sin_port=htons(portnum); //将主机字节序转化为⽹络字节序 ,portnum是端⼝号(server_addr.sin_addr).s_addr=htonl(INADDR_ANY);//IP地址if(-1==bind(server_fd,(struct sockaddr *)&server_addr,sizeof(server_addr))) //套接字与端⼝绑定{perror("bind");exit(6);}//开启监听if(-1==listen(server_fd,5)) //5是最⼤连接数,指服务器最多连接5个⽤户if(-1==listen(server_fd,5)) //5是最⼤连接数,指服务器最多连接5个⽤户{perror("listen");exit(7);}while(1){struct sockaddr_in client_addr;int size=sizeof(client_addr);int new_fd=accept(server_fd,(struct sockaddr *)&client_addr,&size); //server_fd服务器的socket描述字,&client_addr指向struct sockaddr *的指针,&size指向协议地址if(-1==new_fd){perror("accept");continue; //进⾏下⼀次循环}printf("accept client ip:%s:%d\n",inet_ntoa(client_addr.sin_addr),client_addr.sin_port);//inet_ntoa将⼀个⼗进制⽹络字节序转换为点分⼗进制IP格式的字符串。

C#TCPIP通信,Socket通信例子

C#TCPIP通信,Socket通信例子

C#TCPIP通信,Socket通信例⼦1、服务端建⽴监听,等待客户端连接class Program{static void Main(string[] args){TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 8000);Console.WriteLine("1.服务端建⽴监听");listener.Start();Console.WriteLine("等待客户端连接");TcpClient tcpClient = listener.AcceptTcpClient();Console.WriteLine("2.1客户端已经连接");Console.WriteLine("2.2获取到客户端传过来报⽂流");NetworkStream stream = tcpClient.GetStream();Console.WriteLine("3.初始化⼀个字节数组");byte[] data = new byte[1024];Console.WriteLine("4.从流中读取内容到字节数组");int length = stream.Read(data, 0, 1024);Console.WriteLine("5.将字节数组中的内容解析为字符串");string message = Encoding.UTF8.GetString(data, 0, length);Console.WriteLine("6.打印");Console.WriteLine(message);Console.WriteLine("7.关闭流");stream.Close();Console.WriteLine("8.停⽌监听者");listener.Stop();Console.WriteLine("9.程序结束");Console.ReadKey();}}2.从主机连接得到客户端class Program{static void Main(string[] args){Console.WriteLine("0.声明⼀个客户端");TcpClient tcpClient = new TcpClient("127.0.0.1", 8000);Console.WriteLine("1.从客户端得到⼀个流");NetworkStream stream = tcpClient.GetStream();Console.WriteLine("2.请输⼊要发送的内容");string message = Console.ReadLine();Console.WriteLine("3.将输⼊的字符串解析为字节数组");byte[] data = Encoding.UTF8.GetBytes(message);Console.WriteLine("4.将字节内容写⼊流");stream.Write(data, 0, data.Length);Console.WriteLine("5.关闭流");stream.Close();Console.WriteLine("7.关闭客户端");tcpClient.Close();Console.WriteLine("8.程序结束");Console.ReadKey();}}。

C语言实现socket简单通信实例

C语言实现socket简单通信实例

C语⾔实现socket简单通信实例本⽂实例讲述了C语⾔实现socket简单通信的⽅法,分享给⼤家供⼤家参考。

具体实现⽅法如下:服务器端代码如下:/*============================================================================Name : server.cAuthor : kingVersion :Copyright : Your copyright noticeDescription : Hello World in C, Ansi-style============================================================================*/#include <stdlib.h>#include <pthread.h>#include <sys/socket.h>#include <sys/types.h>#include <netinet/in.h>#include <arpa/inet.h> /* inet(3) functions */#include <stdlib.h>#include <errno.h>#include <stdio.h>#include <string.h>int handle(int point);int main(void) {int sfd, ind;struct sockaddr_in addr;struct sockaddr_in clent;char resv[1024], sendbuf[1024];char buf[1024];char * myaddr = "192.168.231.128";int ret; // 返回值设置socklen_t lent;int pid;addr.sin_family = AF_INET; //IPv4 Internet protocolsaddr.sin_port = htons(5050); //这⾥输⼊服务器端⼝号addr.sin_addr.s_addr = inet_addr(myaddr);; //INADDR_ANY表⽰本机IP//獲取socket描述符,IPV4asdprintf("socket start \n");sfd = socket(AF_INET, SOCK_STREAM, 0);if (sfd < 0) {printf("socket error \n");return -1;}printf("bind start \n");//将套接⼦与指定端⼝链接if (bind(sfd, (struct sockaddr *) &addr, sizeof(struct sockaddr)) < 0) {printf("bind error \n");return -1;}//监听套接⼦printf("listen start \n");if (listen(sfd, 1024) < 0) {printf("listen error \n");return -1;}for (;;) {//接受来⾃客户端的信息printf("accept start \n");memset(&clent, 0, sizeof(clent));lent = sizeof(clent);ind = accept(sfd, (struct sockaddr *) &clent, &lent);if (ind < 0) {printf("accept error %d \n", ind);return -1;}printf("infor \n");printf("clent addr%s porit %d\n",inet_ntop(AF_INET, &clent.sin_addr, buf, sizeof(buf)),ntohs(clent.sin_port));pid = fork();if (pid == 0) {//⼦进程close(sfd);handle(ind);} else if (pid < 0) {//errorclose(ind);} else {//⽗进程}}return EXIT_SUCCESS;}int handle(int point) {int retn;char buf[1024];for (;;) {retn = read(point, buf, sizeof(buf));if (retn < 0) {printf("read error \n");close(point);break;} else if (retn == 0) {printf("client exit \n");close(point);break;}printf("client:%s\n", buf);if (strcmp("exit", buf) == 0) {printf("exit \n");close(point);return 0;}}return 0;}客户端代码如下:/*============================================================================ Name : client.cAuthor : kingVersion :Copyright : Your copyright noticeDescription : Hello World in C, Ansi-style============================================================================ */#include <stdio.h>#include <stdlib.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h> /* inet(3) functions */int handle(int fd);int main(void) {int nsd;char buf[1024];char * myaddr = "192.168.231.128";struct sockaddr_in addr;printf("welcome to echo client\n");nsd = socket(AF_INET, SOCK_STREAM, 0);printf("connect start1 \n");//bzero(addr, sizeof(*addr));memset(&addr,0,sizeof(addr));printf("connect start2 \n");addr.sin_family = AF_INET;addr.sin_port = htons(5050);addr.sin_addr.s_addr=inet_addr(myaddr);printf("connect start3 \n");if (connect(nsd, (struct sockaddr *)&addr, sizeof(struct sockaddr)) < 0) {printf("connect error \n");return -1;}sleep(5);printf("handle start\n");handle(nsd);close(nsd);return EXIT_SUCCESS;}int handle(int fd) {char sendl[1024], rev[1024];int retn;for (;;) {memset(sendl,0,sizeof(sendl));memset(rev,0,sizeof(rev));if (fgets(sendl, 1024, stdin) == NULL) {break;}//printf("wirte start\n");write(fd, sendl, strlen(sendl));read(fd, rev,strlen(rev));}return 0;}注意:int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);记住⼀定是值 addrlenaccept socklen_t *addrlen要是⼀个指针希望本⽂所述对⼤家C语⾔⽹络程序设计的学习有所帮助。

vc 6.0 SOCKET 通信 最最简单实例

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;}。

C语言socket编程----实现UDP通信

C语言socket编程----实现UDP通信

C语⾔socket编程----实现UDP通信TCP/IP协议叫做传输控制/⽹际协议,⼜叫做⽹络通信协议。

实际上,它包括上百个功能的协议。

套接字(socket):在⽹络中⽤来描述计算机中不同程序与其他计算程序的通信⽅式。

套接字分为三类;流式socket(SOCK_STREAM):提供可靠,⾯向连接的通信流;它使⽤TCP协议,从⽽保证了数据传输的正确性和顺序性。

数据报socket(SOCK_DGRAM):数据报套接字定义了⼀种⽆连接的服务,数据通过相互独⽴的报⽂进⾏传输,⽆序的,并且不保证可靠,⽆差错的。

它使⽤的数据报协议是UDP。

原始socket:原始套接字允许对底层协议如TP或ICMP进⾏直接访问,它功能强⼤但使⽤复杂,主要⽤于⼀些协议的开发。

下⾯是UDP通信的demo://socket udp 服务端1 #include<stdio.h>2 #include<unistd.h>3 #include<sys/types.h>4 #include<sys/socket.h>5 #include<arpa/inet.h>67int main()8 {9//创建socket对象10int sockfd=socket(AF_INET,SOCK_DGRAM,0);1112//创建⽹络通信对象13struct sockaddr_in addr;14 addr.sin_family =AF_INET;15 addr.sin_port =htons(1324);16 addr.sin_addr.s_addr=inet_addr("127.0.0.1");1718//绑定socket对象与通信链接19int ret =bind(sockfd,(struct sockaddr*)&addr,sizeof(addr));20if(0>ret)21 {22 printf("bind\n");23return -1;2425 }26struct sockaddr_in cli;27 socklen_t len=sizeof(cli);2829while(1)30 {31char buf =0;32 recvfrom(sockfd,&buf,sizeof(buf),0,(struct sockaddr*)&cli,&len);33 printf("recv num =%hhd\n",buf);3435 buf =66;36 sendto(sockfd,&buf,sizeof(buf),0,(struct sockaddr*)&cli,len);3738 }39 close(sockfd);4041 }//socket udp 客户端1 #include<stdio.h>2 #include<sys/types.h>3 #include<sys/socket.h>4 #include<unistd.h>5 #include<arpa/inet.h>67int main()8 {9//创建socket对象10int sockfd=socket(AF_INET,SOCK_DGRAM,0);1112//创建⽹络通信对象13struct sockaddr_in addr;14 addr.sin_family =AF_INET;15 addr.sin_port =htons(1324);16 addr.sin_addr.s_addr = inet_addr("192.168.0.143");1718while(1)19 {20 printf("请输⼊⼀个数字:");21char buf=0;22 scanf("%hhd",&buf);23 sendto(sockfd,&buf,24sizeof(buf),0,(struct sockaddr*)&addr,sizeof(addr));2526 socklen_t len=sizeof(addr);27 recvfrom(sockfd,&buf,sizeof(buf),0,(struct sockaddr*)&addr,&len); 2829if(66 ==buf)30 {31 printf(" server 成功接受\n");32 }33else34 {35 printf("server 数据丢失\n");36 }3738 }39 close(sockfd);4041 }。

C语言之socket开发TCP、UDP通信总结

C语言之socket开发TCP、UDP通信总结

C语言之socket开发TCP、UDP通信总结一、什么是socket?Socket的英文原义是“孔”或“插座”。

在编程中,Socket被称做套接字,是网络通信中的一种约定。

Socket编程的应用无处不在,都与Socket 编程有关。

我们平时使用浏览器查资料,这个过程的技术原理是怎样的呢?我们平时使用浏览器,大致就是这样的一个过程。

这里有两个重要的名词:服务端与客户端。

Socket编程的目的就是如何实现这两端之间的通信。

1、Socket编程在嵌入式中也很重要Socket编程不仅仅在互联网方面很重要,在我们的嵌入式方面也是非常的重要,因为现在很多电子设备都趋向于联网。

比如很多嵌入式工作的招聘要求都会有这一条要求:二、Socket编程中的几个重要概念Socket编程用于解决我们客户端与服务端之间通信的问题。

我们平时多多少少都有听过IP地址、端口、TCP协议、UDP协议等概念,这些都与Socket编程中相关,想要知道怎么用起来,当然得先了解它们的一些介绍。

下面看一下这些专业术语的一些要点介绍:1、什么是IP地址?IP地址(InternetProtocolAddress)是指互联网协议地址,又译为网际协议地址。

IP地址被用来给Internet上的电脑一个编号。

我们可以把“个人电脑”比作“一台电话”,那么“IP地址”就相当于“电话号码”。

若计算机1知道计算机2的IP地址,则计算机1就能访问计算机2。

IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节)。

IP地址通常用点分十进制表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之间的十进制整数。

例:点分十进IP地址(100.4.5.6),实际上是32位二进制数(01100100.00000100.00000101.00000110)。

IP地址有IPv4与IPv6之分,现在用得较多的是IPv4。

其中,有一个特殊的IP地址需要我们记住:127.0.0.1,这是回送地址,即本地机,一般用来测试使用。

C#上位机之—WinForm实现Socket异步通讯示例

C#上位机之—WinForm实现Socket异步通讯示例

C#上位机之—WinForm实现Socket异步通讯⽰例⼯作中常⽤到的⼀些知识点,总是⽤完就忘,第⼀次尝试⽤博客记录下来,以备后⽤;Socket通讯,Socket(套接字)是基于TCP/IP通讯⽅式的封装好的类,调⽤时需要添加下⾯的服务引⽤:.......10using ;11using .Sockets;窗体页⾯搭建,上⾯为服务器区,下⾯为客户端区:建⽴两个类,⼀个表⽰服务器,⼀个表⽰客户端,⾸先建⽴服务器类:1.声明变量:IP地址,端⼝号,EndPoint,Socket类,数据Buffer等1string ip;//IP地址2string port;//端⼝号3 IPEndPoint endPoint;//⽹络端点4 Socket socServer;//侦听连接套接字5 Socket socClient;//通讯套接字6byte[] dataReceived = new byte[50000];78public delegate void delegateDisplayMsg(string type,string msg);9public delegateDisplayMsg OnDisplay;1011public SocketServer()12 {13 socServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);14 }View Code2.侦听连接函数:public void StartListen(string ip,string port){this.ip = ip;this.port = port;endPoint = new IPEndPoint(IPAddress.Parse(this.ip), int.Parse(port));socServer.Bind(endPoint);socServer.Listen(0);socServer.BeginAccept(new AsyncCallback(OnClientConnect), null);ShowMsg("Wait Connect");}View Code3.接受数据函数:public void OnClientConnect(IAsyncResult asyn){socClient = socServer.EndAccept(asyn);WaitForData();ShowMsg("Client Connected " + socClient.RemoteEndPoint.ToString());}public void WaitForData(){if (socClient != null)socClient.BeginReceive(dataReceived, 0, dataReceived.Length, SocketFlags.None, new AsyncCallback(OnDataReceived), null); }public void OnDataReceived(IAsyncResult asyn){int dataLength = socClient.EndReceive(asyn);byte[] chars = new byte[dataLength];Buffer.BlockCopy(dataReceived, 0, chars, 0, dataLength);string msg = Encoding.ASCII.GetString(chars);ShowMsg("<=" + msg);WaitForData();}View Code4.发送数据函数:public void SendMsg(string msg){byte[] data = Encoding.Default.GetBytes(msg);socClient.Send(data);ShowMsg("=>" + msg);}View Code然后建⽴客户端类:1.声明变量string ip;//IP地址string port;//端⼝号IPEndPoint endPoint;//⽹络端点Socket socClient;//通讯套接字byte[] dataReceived = new byte[50000];//数据Bufferpublic delegate void delegateDisplayMsg(string type,string msg);public delegateDisplayMsg OnDisplay;public SocketClient(){socClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);}View Code2.连接服务器函数:public void Connect(string ip, string port){this.ip = ip;this.port = port;endPoint = new IPEndPoint(IPAddress.Parse(this.ip), int.Parse(port));socClient.BeginConnect(endPoint, new AsyncCallback(OnToConnected), null);}View Code3.接受数据函数:public void OnToConnected(IAsyncResult asyn){socClient.EndConnect(asyn);WaitForData();ShowMsg("Connect Success");}public void WaitForData(){if (socClient != null)socClient.BeginReceive(dataReceived, 0, dataReceived.Length, SocketFlags.None, new AsyncCallback(OnDataReceived), null); }public void OnDataReceived(IAsyncResult asyn){int dataLenth = socClient.EndReceive(asyn);byte[] chars = new byte[dataLenth];Buffer.BlockCopy(dataReceived, 0, chars, 0, dataLenth);string msg = Encoding.ASCII.GetString(chars);ShowMsg("<=" + msg);WaitForData();}View Code4.发送数据函数:public void SendMsg(string msg){byte[] data = Encoding.Default.GetBytes(msg);socClient.Send(data);ShowMsg("=>" + msg);}View Code服务器类与客户端类,已经建⽴完成,下⾯对两个类进⾏实例化,并Link窗体控件的事件函数,如下:1.实例化:public void Init(){Server = new SocketServer();Client = new SocketClient();Server.OnDisplay += ShowMsg;Client.OnDisplay += ShowMsg;}2.按钮点击事件:private void btn_StartListen_Click(object sender, EventArgs e){Server.StartListen(txt_serverIP.Text.ToString(), txt_serverPort.Text.ToString());btn_StartListen.BackColor = Color.LimeGreen;}private void btn_Connect_Click(object sender, EventArgs e){Client.Connect(txt_clientIP.Text.ToString(), txt_clientPort.Text.ToString());}private void btn_serverSend_Click(object sender, EventArgs e){Button b = (Button)sender;bool isServer = .Contains("server");if (isServer)Server.SendMsg(txt_serverMsg.Text.ToString());elseClient.SendMsg(txt_clientMsg.Text.ToString());}View Code现在启动程序,测试发送接收功能是否正常⾄此,⼀个简单的Socket通讯模型已经完成,实际应⽤中还需考虑通讯异常,通讯协议,多个客户端通讯等事项,第⼀次写博,欢迎⼤家多多指正;。

LinuxCC++TCPSocket传输文件或图片实例

LinuxCC++TCPSocket传输文件或图片实例

LinuxCC++TCPSocket传输⽂件或图⽚实例环境:Linux语⾔:C/C++通信⽅式:TCP 下⾯⽤TCP协议编写⼀个简单的服务器、客户端,其中服务器端⼀直监听本机的6666号端⼝。

如果收到连接请求,将接收请求并接收客户端发来的消息;客户端与服务器端建⽴连接。

连接建⽴成功后,读取⽂件内容(/root/workspace/socket-picture/bizhi.jpg),发送给服务器端,服务器端新建new1.jpg⽂件,将接收到的⽂件内容保存到new1.jpg中,new1.jpg在当前⽬录下;Server.cpp1 #include<stdio.h>2 #include<stdlib.h>3 #include<string.h>4 #include<errno.h>5 #include<sys/types.h>6 #include<sys/socket.h>7 #include<netinet/in.h>8 #include<unistd.h>910#define MAXLINE 40961112int main(int argc, char** argv){13int listenfd, connfd;14struct sockaddr_in servaddr;15char buff[4096];16 FILE *fp;17int n;1819if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){20 printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);21return0;22 }23 printf("----init socket----\n");2425 memset(&servaddr, 0, sizeof(servaddr));26 servaddr.sin_family = AF_INET;27 servaddr.sin_addr.s_addr = htonl(INADDR_ANY);28 servaddr.sin_port = htons(6666);29//设置端⼝可重⽤30int contain;31 setsockopt(listenfd,SOL_SOCKET, SO_REUSEADDR, &contain, sizeof(int));3233if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){34 printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);35return0;36 }37 printf("----bind sucess----\n");3839if( listen(listenfd, 10) == -1){40 printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);41return0;42 }43if((fp = fopen("new1.jpg","ab") ) == NULL )44 {45 printf("File.\n");46 close(listenfd);47 exit(1);48 }4950 printf("======waiting for client's request======\n");51while(1){52struct sockaddr_in client_addr;53 socklen_t size=sizeof(client_addr);54if( (connfd = accept(listenfd, (struct sockaddr*)&client_addr, &size)) == -1){55 printf("accept socket error: %s(errno: %d)",strerror(errno),errno);56continue;57 }58while(1){59 n = read(connfd, buff, MAXLINE);60if(n == 0)61break;62 fwrite(buff, 1, n, fp);63 }64 buff[n] = '\0';65 printf("recv msg from client: %s\n", buff);66 close(connfd);67 fclose(fp);68 }69 close(listenfd);70return0;71 }Client.cpp1 #include <stdio.h>2 #include <errno.h>3 #include <string.h>4 #include <netdb.h>5 #include <sys/types.h>6 #include <netinet/in.h>7 #include <sys/socket.h>8 #include <stdlib.h>9 #include <unistd.h>10 #include <arpa/inet.h>11 #include <netdb.h>12#define MAXLINE 40961314int main(int argc, char** argv){15int sockfd, len;16char buffer[MAXLINE];17struct sockaddr_in servaddr;18 FILE *fq;1920if( argc != 2){21 printf("usage: ./client <ipaddress>\n");22return0;23 }2425if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){26 printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);27return0;28 }2930 memset(&servaddr, 0, sizeof(servaddr));31 servaddr.sin_family = AF_INET;32 servaddr.sin_port = htons(6666);33if( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){34 printf("inet_pton error for %s\n",argv[1]);35return0;36 }3738if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){ 39 printf("connect error: %s(errno: %d)\n",strerror(errno),errno);40return0;41 }42if( ( fq = fopen("/root/workspace/socket-picture/bizhi.jpg","rb") ) == NULL ){43 printf("File open.\n");44 close(sockfd);45 exit(1);46 }4748 bzero(buffer,sizeof(buffer));49while(!feof(fq)){50 len = fread(buffer, 1, sizeof(buffer), fq);51if(len != write(sockfd, buffer, len)){52 printf("write.\n");53break;54 }55 }56 close(sockfd);57 fclose(fq);5859return0;60 }makefile1 all:server client2 server:server.o3 g++ -g -o server server.o4 client:client.o5 g++ -g -o client client.o6 server.o:server.cpp7 g++ -g -c server.cpp8 client.o:client.cpp9 g++ -g -c client.cpp10 clean:all11 rm all 执⾏make命令后,⽣成server和client两个可执⾏⽂件。

C语言实现Socket编程

C语言实现Socket编程

C语言实现Socket编程tcpsrv.c的内容如下:#include<winsock2.h>#include<stdio.h>#define RECEIVE_MAX_LENGTH 100#define SEND_MAX_LENGTH 100void main(){WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD( 1, 1 );err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 ){return;}if ( LOBYTE( wsaData.wVersion ) != 1|| HIBYTE( wsaData.wVersion ) != 1 ){WSACleanup( );return;}SOCKET socksrv = socket(AF_INET,SOCK_STREAM,0);//监听的套接字SOCKADDR_IN socketadd;socketadd.sin_addr.S_un.S_addr = htonl(INADDR_ANY);socketadd.sin_family = AF_INET;socketadd.sin_port = htons(7001);if( SOCKET_ERROR == bind(socksrv,(SOCKADDR*)&socketadd,sizeof(SOCKADDR)) ) {printf("bind err\n");return;}if( SOCKET_ERROR == listen(socksrv,5) ){printf("listen err");return;}SOCKADDR_IN sockclient;int len = sizeof(SOCKADDR);while(1){SOCKET sockconn = accept(socksrv,(SOCKADDR*)&sockclient,&len);//建立连接的套节字if(INVALID_SOCKET == sockconn ){printf("acc err\n");return;}char sendData[SEND_MAX_LENGTH];//scanf("%s",sendData);//strcpy(sendData, "hello client, i\'m server");sprintf(sendData,"%s","hello client, i\'m server");if( SOCKET_ERROR == send(sockconn,sendData,strlen(sendData)+1,0) ){printf("send err\n");return;}char getData[RECEIVE_MAX_LENGTH];recv(sockconn,getData,RECEIVE_MAX_LENGTH,0);printf("%s\n",getData);closesocket(sockconn);}}tcpclient.c 的内容如下:#include<winsock2.h>#include<stdio.h>#define RECEIVE_MAX_LENGTH 100#define SEND_MAX_LENGTH 100void main(){WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD( 1, 1 );err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 ){return;}if ( LOBYTE( wsaData.wVersion ) != 1|| HIBYTE( wsaData.wVersion ) != 1 ){WSACleanup( );return;}SOCKET socketClient = socket(AF_INET,SOCK_STREAM,0);SOCKADDR_IN clientadd;clientadd.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");clientadd.sin_family = AF_INET;clientadd.sin_port = htons(7001);if( SOCKET_ERROR == connect(socketClient,(SOCKADDR*)&clientadd,sizeof(SOCKADDR)) ) {printf("con err\n");return;}char getData[RECEIVE_MAX_LENGTH];if(recv(socketClient,getData,RECEIVE_MAX_LENGTH,0) == SOCKET_ERROR) {printf("recv err\n");return;}else{printf("%s\n",getData);}char sendData[SEND_MAX_LENGTH];//scanf("%s",sendData);strcpy(sendData, "hello server, i\'m client");//sprintf(sendData,"%s","hello server, i\'m client");send(socketClient,sendData,sizeof(sendData)+1,0);closesocket(socketClient);WSACleanup();}必须先运行服务端程序,再运行客户端程序!。

C语言中的socket编程实例代码

C语言中的socket编程实例代码

C语⾔中的socket编程实例代码前不久刚看完《c primer plus》,收获颇丰,对于C语⾔也有了更全⾯的认识,对于模块化和数据结构也有了更多的想法,之前学过C语⾔,但很多已经记不起了,知识很零散,这也是我看这本书的原因。

之后⼀段时间都会在进⼀步学习编程的同时研究socket通讯,⽬标是要将socket研究透,设计出⾃⼰的框架,以后从事服务器开发和构架应该也会⼤有裨益。

好了,废话不多说,奉上⽹上找的源码。

/* window socket 服务端编程测试 */#include <stdio.h> //⽤于printf等函数的调⽤#include <winsock2.h> //Socket的函数调⽤ #pragma comment (lib, "ws2_32.lib") //C语⾔引⽤其他类库时,除了.h⽂件外,还要加⼊对应的lib⽂件,如果仍提⽰错误则需要在IDE中⼿动加⼊该链接库int main(){WSADATA wsaData;WSAStartup(MAKEWORD(2, 2), &wsaData);SOCKET s=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);sockaddr_in sockaddr;sockaddr.sin_family=PF_INET;sockaddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); //需要绑定到本地的哪个IP地址sockaddr.sin_port=htons(9000); //需要监听的端⼝bind(s, (SOCKADDR*)&sockaddr, sizeof(SOCKADDR)); //进⾏绑定动作listen(s, 1); //启动监听printf("listening on port [%d].\n", 9000);while(TRUE){SOCKADDR clientAddr;int size=sizeof(SOCKADDR);SOCKET clientsocket;clientsocket=accept(s, &clientAddr, &size); //阻塞,直到有新tcp客户端连接printf("***SYS*** New client touched.\n");char* msg="Hello, my client.\r\n";send(clientsocket, msg, strlen(msg)+sizeof(char), NULL); //这⾥的第三个参数要注意,是加了⼀个char长度的printf("***SYS*** HELLO.\n");while(TRUE){char buffer[MAXBYTE]={0};recv(clientsocket, buffer, MAXBYTE, NULL); //⼀直接收客户端socket的send操作printf("***Client*** %s\n", buffer);}closesocket(clientsocket); //关闭socket}closesocket(s); //关闭监听socketWSACleanup(); //卸载getchar();exit(0);}/* window socket 客户端编程测试*/#include <stdio.h> //⽤于输⼊、输出函数的调⽤,printf, gets#include <winsock2.h> //socket头⽂件#include <Windows.h> //为了⽅便调试,所以加⼊了等待2秒才进⾏连接server,这⾥⽤到了sleep函数#pragma comment (lib, "ws2_32") //socket库⽂件typedef struct sockaddr_in sockaddr_in;int main(){Sleep(2000); //沉睡2秒再连接serverWSADATA wsaData;WSAStartup(MAKEWORD(2, 2), &wsaData);SOCKET s=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);sockaddr_in sockaddr;sockaddr.sin_family=PF_INET;sockaddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");sockaddr.sin_port=htons(9000);connect(s, (SOCKADDR*)&sockaddr, sizeof(SOCKADDR));char buffer[MAXBYTE]={0};recv(s, buffer, MAXBYTE, NULL);printf("***SERVER***%s", buffer);while(TRUE){char* mymsg = (char *)malloc(sizeof(char) * 100000);printf("You can chat with server now:\n");gets(mymsg);send(s, mymsg, strlen(mymsg)+sizeof(char), NULL);/*recv函数中的bufferlength参数是可以固定值的send函数中的bufferlength参数不能固定值,需要看实际长度,并且考虑到'\0'字符串*/}closesocket(s);WSACleanup();getchar();exit(0);}/* window socket 客户端编程测试*/#include <stdio.h> //⽤于输⼊、输出函数的调⽤,printf, gets#include <winsock2.h> //socket头⽂件#include <Windows.h> //为了⽅便调试,所以加⼊了等待2秒才进⾏连接server,这⾥⽤到了sleep函数#pragma comment (lib, "ws2_32") //socket库⽂件typedef struct sockaddr_in sockaddr_in;int main(){Sleep(2000); //沉睡2秒再连接serverWSADATA wsaData;WSAStartup(MAKEWORD(2, 2), &wsaData);SOCKET s=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);sockaddr_in sockaddr;sockaddr.sin_family=PF_INET;sockaddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");sockaddr.sin_port=htons(9000);connect(s, (SOCKADDR*)&sockaddr, sizeof(SOCKADDR));char buffer[MAXBYTE]={0};recv(s, buffer, MAXBYTE, NULL);printf("***SERVER***%s", buffer);while(TRUE){char* mymsg = (char *)malloc(sizeof(char) * 100000);printf("You can chat with server now:\n");gets(mymsg);send(s, mymsg, strlen(mymsg)+sizeof(char), NULL);/*recv函数中的bufferlength参数是可以固定值的send函数中的bufferlength参数不能固定值,需要看实际长度,并且考虑到'\0'字符串*/}closesocket(s);WSACleanup();getchar();exit(0);}⼀开始⽆法正常运⾏,总是报错,搜过资料之后终于找到解决办法。

hpsocket c语言例子

hpsocket c语言例子

hpsocket c语言例子HP-Socket是一个基于IOCP(IO Completion Port)的高性能网络通信框架,提供了TCP和UDP的客户端和服务器端实现,支持IPv4和IPv6,适用于Windows操作系统。

下面将列举10个HP-Socket C语言例子,以便更好地理解和使用该框架。

1. 简单的TCP服务器和客户端示例这个例子演示了如何使用HP-Socket框架创建一个简单的TCP服务器和客户端,服务器接收客户端的连接和数据,并将其原样返回给客户端。

2. 异步TCP服务器和客户端示例这个例子展示了如何使用HP-Socket框架创建一个异步的TCP服务器和客户端,服务器和客户端之间的通信是非阻塞的,提高了系统的并发处理能力。

3. UDP服务器和客户端示例这个例子展示了如何使用HP-Socket框架创建一个UDP服务器和客户端,服务器接收客户端发送的数据包,并将其原样返回给客户端。

4. 大文件传输示例这个例子演示了如何使用HP-Socket框架实现大文件的传输,通过分片传输和MD5校验,确保文件传输的可靠性和完整性。

5. SSL加密通信示例这个例子演示了如何使用HP-Socket框架实现SSL加密通信,保护数据在网络传输过程中的安全性。

6. 自定义协议示例这个例子展示了如何使用HP-Socket框架实现自定义协议的通信,通过自定义协议头部和数据格式,实现更灵活的数据交互。

7. 多线程服务器示例这个例子演示了如何使用多线程来处理客户端的连接和数据,提高服务器的并发处理能力。

8. 定时器示例这个例子展示了如何使用HP-Socket框架实现定时器功能,定时执行某些操作,例如定时发送心跳包。

9. 数据压缩和解压缩示例这个例子展示了如何使用HP-Socket框架实现数据的压缩和解压缩,减少数据在网络传输中的带宽占用。

10. 代理服务器示例这个例子演示了如何使用HP-Socket框架实现代理服务器,实现客户端和目标服务器之间的数据转发。

c语言socket 简单实例

c语言socket 简单实例

c语言socket 简单实例下面是一个简单的 C 语言使用 socket 的例子。

这个例子演示了如何使用 socket 创建一个 TCP 服务器和客户端,服务器端会监听来自客户端的连接,并发送一条消息给客户端。

服务器端代码:```c#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/socket.h>#include <arpa/inet.h>#include <unistd.h>#define PORT 8080int main() {int server_fd, new_socket;struct sockaddr_in address;int addrlen = sizeof(address);char buffer[1024] = {0};char *hello = "Hello from server";// 创建 socket 文件描述符if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("socket failed");exit(EXIT_FAILURE);}address.sin_family = AF_INET;address.sin_addr.s_addr = INADDR_ANY;address.sin_port = htons(PORT);// 绑定 socket 到指定的地址和端口号if (bind(server_fd, (struct sockaddr *)&address,sizeof(address)) < 0) {perror("bind failed");exit(EXIT_FAILURE);}// 监听来自客户端的连接请求if (listen(server_fd, 3) < 0) {perror("listen failed");exit(EXIT_FAILURE);}printf("Server is listening on port %d...\n", PORT);// 接受来自客户端的连接请求,并创建新的 socket 文件描述符 if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {perror("accept failed");exit(EXIT_FAILURE);}// 向客户端发送消息send(new_socket, hello, strlen(hello), 0);printf("Hello message sent.\n");return 0;}```。

基于VC++6.0 Socket编程操作实例

基于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。

使用CC++实现Socket聊天程序

使用CC++实现Socket聊天程序

使用C/C++实现Socket聊天程序Initsock.h文件// initsock.h文件#include <winsock2.h>#include <stdlib.h>#include <conio.h>#include <stdio.h>#pragma comment(lib, "WS2_32"> // 链接到WS2_32.libclass CInitSock{public:CInitSock(BYTE minorVer = 2, BYTE majorVer = 2>{// 初始化WS2_32.dllWSADATA wsaData。

WORD sockV ersion = MAKEWORD(minorVer, majorVer>。

if(::WSAStartup(sockV ersion, &wsaData> != 0>{exit(0>。

}}~CInitSock(>{::WSACleanup(>。

}}。

TCP版TCPClient.cpp文件//////////////////////////////////////////////////////////// TCPClient.cpp文件/*《使用说明》0.运行程序前请查看是否将initsock.h文件引入到项目中。

1.首先修改聊天对方的IP地址2.请首先运行服务端<TCPServer)程序,再运行客户端<TCPClient)程序:如配置正确服务端会收到相关连接信息。

3.连接成功后,需要由服务器端首先发起会话<输入消息并确认发送),客户端收到消息后才能输入消息并确认发送到服务器端。

并且双方每次只能发送一条消息。

如想发送第二条消息,需要等待该方成功接受到另一方的消息后才能继续输入消息。

*/#include "InitSock.h"#include <stdio.h>#include <iostream.h>CInitSock initSock。

MFC中利用CSocket实现UDP通信

MFC中利用CSocket实现UDP通信

MFC中利⽤CSocket实现UDP通信这两天⼀直在找MFC下⽤CSocket实现UDP通信,尝试了⽹上不少的资料都没有成功,可能是⾃⼰在什么地⽅出错了。

最后参考顺利实现了。

⾃⼰也顺便作⼀些总结,希望可以利⼈利⼰。

源代码请到下载。

基本界⾯如下:UDP通信时双⽅地位是对等的,不⽤像TCP那样要在服务器端设置⼀个监听Socket。

第⼀步:调⽤在本机上创建⼀个Socket。

实例中⽤到:m_pSocket->Create(m_localPortNum, SOCK_DGRAM);其中m_localPortNum代表创建的Socket关联到本机上的端⼝号, SOCK_DGRAM代表是UDP通信。

第⼆步:调⽤让新创建的Socket与远程主机的指定端⼝通信。

实例中⽤到:m_pSocket->Bind(m_peerPortNum, m_strPeerIPaddr);其中m_peerPortNum是远程主机中UDP通信的端⼝号, m_strPeerIPaddr代表远程主机的IP地址。

UDP通信的双⽅通过第⼀步和第⼆步,就知道信息该发送到哪个IP地址和端⼝号了,接下来该实际发送数据了。

第三步:准备好数据调⽤,将数据发送到远程主机上。

实例中⽤到: m_pSocket->SendTo(m_dataToSend, m_dataToSend.GetLength(), m_peerPortNum, m_strPeerIPaddr);其中第⼀个参数指定了要发送的数据,第⼆个参数指定了发送数据的长度,第三个参数指定了远程主机的端⼝号,第四个参数指定了远程主机IP地址。

第四步:数据接收⽅会⾃动启⽤来响应,只需在OnReceive函数中调⽤ReceiveFrom函数来读取数据即可。

实例中改写了CUdpSocket类的OnReceive,⽬的就是调⽤AfxMessgeBox显⽰接受到数据。

void CUdpSocket::OnReceive(int nErrorCode){// TODO: Add your specialized code here and/or call the base classTCHAR recBuf[1024];int len = sizeof(SOCKADDR_IN);ZeroMemory(recBuf, sizeof(recBuf));int recBytes = ReceiveFrom(recBuf, 1023, (SOCKADDR*)&m_clientAddr, &len, 0);if (0 == recBytes){AfxMessageBox(TEXT("UDP连接已经关闭!"));}else if (SOCKET_ERROR == recBytes){AfxMessageBox(TEXT("接受数据失败!"));}else{CString strBuf;strBuf.Format(TEXT("收到数据: %s"), recBuf);AfxMessageBox(strBuf, MB_OK);}CSocket::OnReceive(nErrorCode);}。

利用MFC的Csocket类实现网络通信

利用MFC的Csocket类实现网络通信

利用MFC的Csocket类实现网络通信2007年06月27日星期三11:29近年来,利用Internet进行网际间通讯,在WWW浏览、FTP、Gopher这些常规服务,以及在网络电话、多媒体会议等这些对实时性要求严格的应用中成为研究的热点,而且已经是必需的了。

Windows环境下进行通讯程序设计的最基本方法是应用Windows Sockets实现进程间的通讯,为此微软提供了大量基于Windows Sockets的通讯API,如WinSockAPI、WinInetAPI和ISAPI,并一直致力于开发更快、更容易的通讯API,将其和MFC集成在一起以使通讯编程越来越容易。

本实例重点介绍使用MFC的CSocket类编写网络通讯程序的方法,并通过使用CSocket类实现了网络聊天程序。

程序编译运行后的界面效果如图一所示:图一、网络聊天程序界面效果图一、实现方法微软的MFC把复杂的WinSock API函数封装到类里,这使得编写网络应用程序更容易。

CAsyncSocket类逐个封装了WinSock API,为高级网络程序员提供了更加有力而灵活的方法。

这个类基于程序员了解网络通讯的假设,目的是为了在MFC中使用WinSock,程序员有责任处理诸如阻塞、字节顺序和在Unicode与MBCS 间转换字符的任务。

为了给程序员提供更方便的接口以自动处理这些任务,MFC给出了CSocket类,这个类是由CAsyncSocket类继承下来的,它提供了比CAsyncSocket更高层的WinSock API接口。

Csocket类和CsocketFile类可以与Carchive类一起合作来管理发送和接收的数据,这使管理数据收发更加便利。

CSocket对象提供阻塞模式,这对于Carchive的同步操作是至关重要的。

阻塞函数(如Receive()、Send()、ReceiveFrom()、SendTo() 和Accept())直到操作完成后才返回控制权,因此如果需要低层控制和高效率,就使用CasyncSock类;如果需要方便,则可使用Csocket类。

计算机网络C语言Socket编程,实现两个程序间的通信

计算机网络C语言Socket编程,实现两个程序间的通信

计算机⽹络C语⾔Socket编程,实现两个程序间的通信C语⾔S o c k e t编程,实现两个程序间的通信se r v e r和cli e n t通信流程图在mooc上找到的,使⽤Socket客户端client和服务端server通信的流程图不⼀定只⽤codeblock,⽤devcpp编译器也可以的,需要很简单的配置⼀下编译环境实现两个程序间的通信1.服务端se r v e r服务端需要 "两个"套接字 :1.服务端套接字serverSocket2.客户端connect连接请求时,发来的套接字clientSocket按流程图来看, server服务端主要就是实现下⾯⼏个步骤:0.WSAStartup初始化 //这个东西也不知道是什么⿁,反正就是要初始化⼀下,不初始化会创建socket失败!1.服务端套接字 = socket(); //获取⼀个套接字对象吧?2.bind(服务端套接字); //绑定3.listen(服务端套接字); //监听---这个时候客户端就可以发连接请求到服务端了,此时服务端会⽤accept阻塞进程,直到获取客户端发来的请求---4.客户端套接字 = accept(); //收到客户端发来的请求,accept返回客户端的套接字对象5.recv(客户端套接字,要发的消息message) //recv会阻塞进程,直到客户端发送消息过来----printf(message)把接收到的消息打印出来-----6.send(客户端套接字,要发的消息message) //服务端也可以使⽤send,向客户端发送消息---这⾥可以循环,跳转回到步骤3.accept 开启新⼀轮的接收请求---7.closesocket(客户端套接字);所以服务端代码可以这样写在windows下需要更改很多头⽂件,和⼀些函数,wsastartup这个东西也需要初始化⼀下。

改了之后,⼀个可以⽤的服务端server代码#include <sys/stat.h>#include <fcntl.h>#include <winsock2.h>#include <windows.h>#pragma comment(lib, "wsock32.lib")#include <errno.h>#include<stdlib.h>#include<string.h>#include <sys/types.h>#include<ws2tcpip.h>#include <stdio.h>#include <unistd.h>#define SERVER_PORT 6666/*监听后,⼀直处于accept阻塞状态,直到有客户端连接,当客户端如数quit后,断开与客户端的连接*/int main(){//调⽤socket函数返回的⽂件描述符int serverSocket;//声明两个套接字sockaddr_in结构体变量,分别表⽰客户端和服务器struct sockaddr_in server_addr;struct sockaddr_in clientAddr;int addr_len = sizeof(clientAddr);int client;char buffer[200]; //存储发送和接收的信息int iDataNum;//必须先初始化WSADATA wsaData;WSAStartup(MAKEWORD(2,2),&wsaData);if(LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) !=2){ printf("require version fail!");return -1;}//socket函数,失败返回-1//int socket(int domain, int type, int protocol);//第⼀个参数表⽰使⽤的地址类型,⼀般都是ipv4,AF_INET//第⼆个参数表⽰套接字类型:tcp:⾯向连接的稳定数据传输SOCK_STREAM//第三个参数设置为0//建⽴socketif((serverSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) < 0) {perror("socket");return 1;}//初始化server_addrmemset(&server_addr,0, sizeof(server_addr));memset(&server_addr,0, sizeof(server_addr));//初始化服务器端的套接字,并⽤htons和htonl将端⼝和地址转成⽹络字节序server_addr.sin_family = AF_INET;server_addr.sin_port = htons(SERVER_PORT);//ip可是是本服务器的ip,也可以⽤宏INADDR_ANY代替,代表0.0.0.0,表明所有地址server_addr.sin_addr.s_addr = htonl(INADDR_ANY);//对于bind,accept之类的函数,⾥⾯套接字参数都是需要强制转换成(struct sockaddr *)//bind三个参数:服务器端的套接字的⽂件描述符,if(bind(serverSocket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0){perror("connect");return 1;}//设置服务器上的socket为监听状态if(listen(serverSocket, 5) < 0){perror("listen");return 1;}//循环接收消息、发送消息while(1){printf("监听端⼝: %d\n", SERVER_PORT);//调⽤accept函数后,会进⼊阻塞状态//accept返回⼀个套接字的⽂件描述符,这样服务器端便有两个套接字的⽂件描述符,//serverSocket和client。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

刚刚学windows编程,所以想写学习笔记,这是一个简单的Socket 程序例子,开发环境是vc6:首先是TCPserver端:[cpp]view plaincopy1.#include "stdafx.h"2.#include <stdio.h>3.#include <winsock2.h>4.5.#pragma comment(lib,"ws2_32.lib")6.7.int main(int argc, char* argv[])8.{9.//初始化WSA10.WORD sockVersion = MAKEWORD(2,2);11. WSADATA wsaData;12.if(WSAStartup(sockVersion, &wsaData)!=0)13. {14.return 0;15. }16.17.//创建套接字18. SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);19.if(slisten == INVALID_SOCKET)20. {21. printf("socket error !");22.return 0;23. }24.25.//绑定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;30.if(bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)31. {32. printf("bind error !");33. }34.35.//开始监听36.if(listen(slisten, 5) == SOCKET_ERROR)37. {38. printf("listen error !");39.return 0;40. }41.42.//循环接收数据43. SOCKET sClient;44. sockaddr_in remoteAddr;45.int nAddrlen = sizeof(remoteAddr);46.char revData[255];47.while (true)48. {49. printf("等待连接...\n");50. sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen);51.if(sClient == INVALID_SOCKET)52. {53. printf("accept error !");54.continue;55. }56. printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));57.58.//接收数据59.int ret = recv(sClient, revData, 255, 0);60.if(ret > 0)61. {62. revData[ret] = 0x00;63. printf(revData);64. }65.66.//发送数据67.char * sendData = "你好,TCP客户端!\n";68. send(sClient, sendData, strlen(sendData), 0);69. closesocket(sClient);70. }71.72. closesocket(slisten);73. WSACleanup();74.return 0;75.}client端:[cpp]view plaincopy1.#include "stdafx.h"2.#include <WINSOCK2.H>3.#include <STDIO.H>4.5.#pragma comment(lib,"ws2_32.lib")6.7.8.int main(int argc, char* argv[])9.{10.WORD sockVersion = MAKEWORD(2,2);11. WSADATA data;12.if(WSAStartup(sockVersion, &data) != 0)13. {14.return 0;15. }16.17. SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);18.if(sclient == INVALID_SOCKET)19. {20. printf("invalid socket !");21.return 0;22. }23.24. 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");28.if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)29. {30. printf("connect error !");31. closesocket(sclient);32.return 0;33. }34.char * sendData = "你好,TCP服务端,我是客户端!\n";35. send(sclient, sendData, strlen(sendData), 0);36.37.char recData[255];38.int ret = recv(sclient, recData, 255, 0);39.if(ret > 0)40. {41. recData[ret] = 0x00;42. printf(recData);43. }44. closesocket(sclient);45. WSACleanup();46.return 0;47.}然后是UDPserver端:[cpp]view plaincopy1.#include "stdafx.h"2.#include <stdio.h>3.#include <winsock2.h>4.5.#pragma comment(lib, "ws2_32.lib")6.7.int main(int argc, char* argv[])8.{9. WSADATA wsaData;10.WORD sockVersion = MAKEWORD(2,2);11.if(WSAStartup(sockVersion, &wsaData) != 0)12. {13.return 0;14. }15.16. SOCKET serSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);17.if(serSocket == INVALID_SOCKET)18. {19. printf("socket error !");20.return 0;21. }22.23. 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;27.if(bind(serSocket, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)28. {29. printf("bind error !");30. closesocket(serSocket);31.return 0;32. }33.34. sockaddr_in remoteAddr;35.int nAddrLen = sizeof(remoteAddr);36.while (true)37. {38.char recvData[255];39.int ret = recvfrom(serSocket, recvData, 255, 0, (sockaddr *)&remoteAddr, &nAddrLen);40.if (ret > 0)41. {42. recvData[ret] = 0x00;43. printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));44. printf(recvData);45. }46.47.char * sendData = "一个来自服务端的UDP数据包\n";48. sendto(serSocket, sendData, strlen(sendData), 0, (sockaddr *)&remoteAddr, nAddrLen);49.50. }51. closesocket(serSocket);52. WSACleanup();53.return 0;54.}client端:[cpp]view plaincopy1.#include "stdafx.h"2.#include <stdio.h>3.#include <winsock2.h>4.5.#pragma comment(lib, "ws2_32.lib")6.7.int main(int argc, char* argv[])8.{9.WORD socketVersion = MAKEWORD(2,2);10. WSADATA wsaData;11.if(WSAStartup(socketVersion, &wsaData) != 0)12. {13.return 0;14. }15. SOCKET sclient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);16.17. 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");21.int len = sizeof(sin);22.23.char * sendData = "来自客户端的数据包.\n";24. sendto(sclient, sendData, strlen(sendData), 0, (sockaddr *)&sin, len);25.26.char recvData[255];27.int ret = recvfrom(sclient, recvData, 255, 0, (sockaddr *)&sin, &len);28.if(ret > 0)29. {30. recvData[ret] = 0x00;31. printf(recvData);32. }33.34. closesocket(sclient);35. WSACleanup();36.return 0;37.}。

相关文档
最新文档