標籤:nbsp char oid 等待隊列 can tin creat start ted
#include <Winsock2.h>#include <stdio.h>void main(){ // 以下的幾句都是固定的 WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 1, 1 ); err = WSAStartup( wVersionRequested, &wsaData );//該函數的功能是載入一個Winsocket庫版本 if ( err != 0 ) { return; } if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) { WSACleanup( ); return; } //真正socket編程部分 SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//連線導向的可靠性服務SOCK_STRAM SOCKADDR_IN addrSrv;//存放本地地址資訊的 addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//htol將主機位元組序long型轉換為網路位元組序 addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(6001);//htos用來將連接埠轉換成字元,1024以上的數字即可 bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//將socket綁定到相應地址和連接埠上 listen(sockSrv,20);//等待隊列中的最大長度為5 SOCKADDR_IN addrClient; int len=sizeof(SOCKADDR); while(1) { SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);//建立一個新的通訊端用於通訊,不是前面的監聽通訊端 char sendBuf[100]; sprintf(sendBuf,"Server IP is:%s", inet_ntoa(addrClient.sin_addr));//inet_nota函數是將字元轉換成ip地址 char recvBuf[100]; recv(sockConn,recvBuf,100,0);//伺服器從用戶端接受資料 printf("%s\n",recvBuf); if(strcmp(recvBuf,"Reconnect")==0) { Sleep(5000); strcpy(sendBuf,"Finished"); send(sockConn,sendBuf,strlen(sendBuf)+1,0);//伺服器向用戶端發送資料 } closesocket(sockConn);//關閉socket }}
Mac 端
#include <netinet/in.h> // for sockaddr_in#include <sys/types.h> // for socket#include <sys/socket.h> // for socket#include <stdio.h> // for printf#include <stdlib.h> // for exit#include <string.h> // for bzero/* #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> */#define HELLO_WORLD_SERVER_PORT 6001#define BUFFER_SIZE 1024#define FILE_NAME_MAX_SIZE 512int main(int argc, char **argv){ //設定一個socket地址結構client_addr,代表客戶機internet地址, 連接埠 struct sockaddr_in client_addr; bzero(&client_addr,sizeof(client_addr)); //把一段記憶體區的內容全部設定為0 client_addr.sin_family = AF_INET; //internet協議族 client_addr.sin_addr.s_addr = htons(INADDR_ANY);//INADDR_ANY表示自動擷取本機地址 client_addr.sin_port = htons(0); //0表示讓系統自動分配一個空閑連接埠 //建立用於internet的流協議(TCP)socket,用client_socket代表客戶機socket int client_socket = socket(AF_INET,SOCK_STREAM,0); if( client_socket < 0) { printf("Create Socket Failed!\n"); exit(1); } //把客戶機的socket和客戶機的socket地址結構聯絡起來 if( bind(client_socket,(struct sockaddr*)&client_addr,sizeof(client_addr))) { printf("Client Bind Port Failed!\n"); exit(1); } //設定一個socket地址結構server_addr,代表格服務器的internet地址, 連接埠 struct sockaddr_in server_addr; bzero(&server_addr,sizeof(server_addr)); server_addr.sin_family = AF_INET; if(inet_aton("192.168.1.149",&server_addr.sin_addr) == 0) //伺服器的IP地址來自程式的參數 { printf("Server IP Address Error!\n"); exit(1); } server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT); socklen_t server_addr_length = sizeof(server_addr); //向伺服器發起串連,串連成功後client_socket代表了客戶機和伺服器的一個socket串連 if(connect(client_socket,(struct sockaddr*)&server_addr, server_addr_length) < 0) { printf("Can Not Connect To %s!\n",argv[1]); exit(1); } char buffer[BUFFER_SIZE]; bzero(buffer,BUFFER_SIZE); strcpy(buffer, "Reconnect"); //向伺服器發送buffer中的資料 send(client_socket,buffer,BUFFER_SIZE,0); //從伺服器接收資料到buffer中 bzero(buffer,BUFFER_SIZE); int length = 0; if(recv(client_socket,buffer,BUFFER_SIZE,0)>0) { printf("Received %s\n",buffer); } //關閉socket close(client_socket); return 0;}
windows 與 mac socket通訊