在C++中编辑scoket
//从我以前的一个程序里面抠一段出来给你看看 //客户端用不到bind、accept的#include using namespace std;namespace NetWorks{#include #include "winsock2.h"#pragma comment(lib,"Ws2_32.lib")#define BUFFSIZE 65535#define HTTP_GET "GET %s HTTP/1.1rnAccept: */*rnAccept-Language: zh-cnrnUA-CPU: x86rnAccept-Encoding: gzip, deflaternUser-Agent: KingKe/3.0 (USTC0611)rnHost: %srnConnection: Keep-AlivernCookie: %srnrn"#define HTTP_POST "POST /%s HTTP/1.1rnAccept: */*rnAccept-Language: zh-cnrnUA-CPU: x86rnAccept-Encoding: gzip, deflaternUser-Agent: KingKe/3.0 (USTC0611)rnHost: %srnContent-Type: application/x-www-form-urlencodedrnContent-Length: %drnConnection: Keep-Alivernrn%srnrn"typedef struct sockaddr_in NetAddr;bool Start;class WinSocket{public:WSADATA wsd;int Socket;int Error;char *Buff;NetAddr Destination;WinSocket(int AF,int Type,int Protocol);int Connect(const char*name,int PortNum=80){HOSTENT* Host;Host=gethostbyname(name);memcpy(&Destination.sin_addr, Host->h_addr_list[0],Host->h_length);Destination.sin_family = Host->h_addrtype;Destination.sin_port = htons(PortNum);Socket=socket(AF_INET,SOCK_STREAM,0);Error=connect(Socket,(struct sockaddr*)&Destination, sizeof(Destination));return 1;}int Send(char*SendBuffer){return send(Socket,SendBuffer,strlen(SendBuffer),0);}int Receive(char*ReceiveBuffer){return recv(Socket,ReceiveBuffer,BUFFSIZE,0);}void Close(){closesocket(Socket);}~WinSocket(){closesocket(Socket);}};}using namespace NetWorks;void main(int argc,char *arg[]){char Buff[BUFFSIZE]="";char host[50]="202.38.11.11";//主机char dir[50]="/index.html";//页面相对路径WSADATA wsd;WSAStartup(WINSOCK_VERSION,&wsd);WinSocket WS;WS.Connect(host);sprintf(Buff,HTTP_GET,dir,host,"");//GET方法//sprintf(Buff,HTTP_GET,dir,host,"");//POST方法WS.Send(Buff);Buff[WS.Receive(Buff)]=0;cout<

C++ 如何使用 Socket 类向 HTTP 服务器发送数据和接收响应
Socket编程首先要包含所需的头文件Winsock2.h并工程中添加库文件ws2_32.lib. 接着加载套接字库所用函数是WSAStartup( wVersionRequested, &wsaData ); 第一个参数代表的是所要加载的套接字库的版本,第二个参数用于存储返回的版本信息wVersionRequested = MAKEWORD( 1, 1 );用MAKEWORD来设置版本号的值其中地位代表主版本号TCP编程:服务器端的编写:1. 创建套接字SOCKET socketSrc = socket(AF_INET, SOCK_STREAM, 0);第一个参数:指定地址族在1.1版本中只能使用AF_INET第二个参数:指定套接字的类型在1.1版本中指定指定两种一SOCK_STREAM流式套接字和SOCK_DREAM数据报套接字第三个参数:指示所要使用的的协议,如果为0则自动选择合适的协议(推荐)2. 绑定套接字bind(socketSrc, (SOCKADDR*)&addsrc, sizeof(SOCKADDR));第一个参数:一个未绑定的的套接字第二个参数:通过一个SOCKADDR结构体将一个地址分配给套接字第三个参数:第二个参数的大小长度SOCKADDR结构体: struct sockaddr_in {short sin_family;u_short sin_port;struct in_addr sin_addr;charsin_zero[8];};第一个成员:sin_family地址族(这个参数不使用网络字节序列,其他参数都是网络字节序列)第二个成员:sin_port指定要绑定的端口使用htons来转换成网络字节序列因为是无符号短整型第三个成员:in_addr的结构体用来存放地址in_addr的结构如下struct in_addr {union {structS_un_b;structS_un_w;u_long S_addr;} S_un;};可以看出in_addr是一个包含一个联合体的结构体,联合体可以用来存放不同类型的数据但只存放一个数据,根据选择不同而不同,我们的程序中选择的是长整型的变量S_addr来存放一个地址需用htonl来转换成为网络字节序;l htonl和htons区别是在于一个是将一个32位的主机字节序列转换成32位的TCP/IP的网络字节序一个则是16位l inet_addr的用处是将一个点分制的IP地址字符串转换为一个合适的 in_addr的变量。l inet_ntoa将一个网络地址转换为标准的点分式地址格式的字符串3. 监听套接字:listen(socketSrc, 5); //listen用于将一个已绑定但未连接的套接字对象设定成监听模式等 到一个即将到来的连接第二个参数:表示等待连接的最大长度,如果参数被设置为SOMAXCONN将被设成一个最大的可能值4. 接受连接:在一个被设置为监听的套接字上允许一个连接,并返回一个已连接的新的套接字SOCKET socketconn = accept(socketSrc, (SOCKADDR*)&addclient, &len);第一个参数:一个被设置为监听状态的套接字;第二个参数:一个SOCKADDR结构体用于保存请求连接的实体的地址,根据地址族的不同所创建的结构体不一样第三个参数:存储地址的长度,此参数在调用accept函数前必须初始化,否则会导致调用失败5. 完成以上工作后通过recv和send函数来接收和发送数据recv(socketconn, recvbuf, 100, 0);第一个参数是一个已连接的套接字第二个参数是用来存储接收的数据的缓冲区地址第三个参数表示缓冲区的大小第四个参数指示接收的模式此处设为0客户端的编写6. 首先也是创建套接字7. 然后在建立连接connect(sockclient, (SOCKADDR*)&addsrc, sizeof(SOCKADDR));第二个参数是要连接的地址,第三个参数则是地址的大小UDP编程部分在简单的多线程聊天室的编写中详细说明他是基于无连接的协议所以编写服务器端时只要绑定了套接字后就可以开始传送和接受数据,而客户端则只需创建套接字就可以开始传送和接收同过 recvfrom和sendto函数来操作使用closesocket(m_socket);关闭一个套接字,使用WSACleanup();来释放套接字库 希望对你有帮助呵呵 这是在VC下的
客户端发送请求给服务器,服务器处理完毕以后把Socket tempSocket = (你还可以检测收到的1W8数据是3W8里面的哪一部分. 这个把发送的数据和接收的

c++ socket 创建线程
线程的使用在socket应用还是非socket应用是都是相同的没有什么区别只需要在应用中需要使用线程的地方创建线程就可以了一般socket服务器线程模型是指在服务器接收到新的链接时会创建一个线程来与该链接进行数据交流在accept成功返回后就立即创建一个线程,并将一些与之链接相关的私有数据传递给该线程后服务器会继续等待新的链接而之前的链接则交由新创建的线程来服务一个简单的模型类型于这样1、等待链接2、链接成功,创建一个新线程,并将相关数据传递给该线程3、再回到1下面以linux下的一个简单的echo服务器(回显服务,回显任何接收到的数据)为例(socket编程的方法大致都是相通的,linux和windows都大相径庭,只是稍有不同而已,在线程模型上都是一样的)说明socket的多线程服务器模型#include
#include #include #include #include #include #include #define PORT htons(8888)typedef struct sockaddr SA;typedef struct sockaddr_in SA_IN;typedef struct{ int sockfd; SA_IN addr;}DATA;void err_quit(const char *msg){ perror(msg); exit(-1);}void echo(DATA *data){ char buf[1024]; size_t n; printf("new thread %sn",inet_ntoa(data->addr.sin_addr)); while((n=recv(data->sockfd,buf,sizeof(buf)-1,0)) > 0) { if(strncmp(buf,"exit",4) == 0) break; send(data->sockfd,buf,n,0); } close(data->sockfd); free(data); pthread_exit(NULL);}int main(int argc,char **argv){ int sockfd,newfd; SA_IN addr,serv; DATA *data; sockfd=socket(AF_INET,SOCK_STREAM,0); if(sockfd == -1) err_quit("socket"); bzero(&serv,sizeof(SA_IN)); serv.sin_family=AF_INET; serv.sin_port=PORT; serv.sin_addr.s_addr=INADDR_ANY; if(bind(sockfd,(SA *)&serv,sizeof(SA)) == -1) err_quit("bind"); if(listen(sockfd,20) == -1) err_quit("listen"); while(1) { socklen_t addrlen; pthread_t id; bzero(&addr,sizeof(SA_IN)); newfd=accept(sockfd,(SA *)&addr,&addrlen); if(newfd == -1) { perror("accept"); continue; } data=malloc(sizeof(DATA)); if(data == NULL) { close(newfd); continue; } data->sockfd=newfd; memcpy(&data->addr,&addr,sizeof(SA_IN)); pthread_create(&id,NULL,(void *)echo,data); //创建一个工作线程 } return 0;}由此可见,在socket中使用线程和其它应用中使用线程是没有任何区别的
看你的意思,你是想些服务器。你是想用一个线程收数据,另一个线程发送数据么?这样其实没啥意义。如果你是简单的想把数据返回回去,只需要在recv后在send回去就行了,这两个函数默认都是阻塞的。如果是两个线程反而会出现多线程问题。如果你实在要这么弄,你只需要在你的两个线程中弄两个死循环,然后一个死循环里掉recv,另一个掉send就行了。你这其实是一种很低效的并发服务器方案(并发服务器用来解决顺序服务器不能及时响应的问题,也就是你说的主界面等卡死的问题)。你可以去网上百度一下 “网络服务器模型”,上面又很多改良方案。自己去学习吧,代码应该都有。
只要创建一个线程就可以发送和接收了,就调用下recv和read

JAVA Socket编程和C++Socket编程有什么不同
Socket 是winsock里的原始套接字开发接口API,c++/java他们是开发语言,而socket是一种通讯标准简称。首先,2者提供的接口不同(主要是封装形式不同),java本身不带socket通讯底层实现的,而是通过调用系统底层的winsockAPI进行的二次封装,而c/c++的socket可以理解为更接近系统层面的winsock,所以c/c++的socket可以提供更多的底层扩展与控制。其次,从语言上讲,用JAVA发开出来的socket程序可以在任何支持JAVA虚拟机上运行,不用修改任何代码。而C/c++ 要根据系统特性进行适当的修改。

关于C++ socket编程出错的问题
if(connect(client,(const struct sockaddr *)&clientService,sizeof(clientService))==SOCKET_ERROR) {printf("Failed to connect.n");WSACleanup();return; }

本文由 在线网速测试 整理编辑,转载请注明出处。