您的位置:首页 > 编程语言

socket代码学习笔记

2017-08-26 15:48 323 查看
//可以运行但未测试结果

#include <Ws2tcpip.h>
#pragma comment(lib,"Ws2_32.lib")
#include <stdio.h>
#include <Winsock2.h>
#include <Windows.h>
void 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 addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);

bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));

listen(sockSrv, 5);

SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
while (1)
{
SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len);
char sendBuf[50];
sprintf_s(sendBuf, "Welcome %s to here!", addrClient.sin_addr);
send(sockConn, sendBuf, strlen(sendBuf) + 1, 0);
char recvBuf[50];
recv(sockConn, recvBuf, 50, 0);
printf("%s\n", recvBuf);
closesocket(sockConn);
}

}

////////////////////

#include <WINSOCK2.H>

#include <stdio.h>

#pragma comment(lib,"ws2_32.lib")

int main()

{

int err;

WORD versionRequired;

WSADATA wsaData;

versionRequired = MAKEWORD(1, 1);

err = WSAStartup(versionRequired, &wsaData);//协议库的版本信息

if (!err)

{

printf("客户端嵌套字已经打开!\n");

}

else

{

printf("客户端的嵌套字打开失败!\n");

return 0;//结束

}

SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, 0);

SOCKADDR_IN clientsock_in;

clientsock_in.sin_addr.S_un.S_addr = ULONG("192.168.155.2");

clientsock_in.sin_family = AF_INET;

clientsock_in.sin_port = htons(6000);

//bind(clientSocket,(SOCKADDR*)&clientsock_in,strlen(SOCKADDR));//注意第三个参数

//listen(clientSocket,5);

if (connect(clientSocket, (SOCKADDR*)&clientsock_in, sizeof(SOCKADDR)) != SOCKET_ERROR)
printf("connect succeed!\n");
else printf("connect failed!\n");
//开始连接

char receiveBuf[100];

recv(clientSocket, receiveBuf, 101, 0);

//printf("%s\n", receiveBuf);

if (send(clientSocket, "hello,this is client", strlen("hello,this is client") + 1, 0) != SOCKET_ERROR)
printf("send message succeed!\n");
else printf("send message faild!\n");

closesocket(clientSocket);

WSACleanup();

system("pause");
return 0;

}

///////////////////

服务端
#include <stdio.h>                   //用于printf等函数的调用
#include <winsock2.h>                //Socket的函数调用 
#pragma comment (lib, "ws2_32")

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);

WSACleanup();                                                //卸载
getchar();
exit(0);
return 0;
}

//客户端
#include <stdio.h>                      //用于输入、输出函数的调用,printf, gets
#include <winsock2.h>                   //socket头文件
#include <Windows.h>                    //为了方便调试,所以加入了等待2秒才进行连接server,这里用到了sleep函数

int main()
{
Sleep(2000);                        //沉睡2秒再连接server
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
SOCKET s=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
sockaddr_in sockaddr;
sockaddr
10a27
.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=new 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);
}

/////////////////
可用服务端

#include <stdio.h>
#include <Winsock2.h> //windows socket的头文件

#pragma comment( lib, "ws2_32.lib" )// 链接Winsock2.h的静态库文件

int main()
{
//初始化winsocket
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1 );//第一个参数为低位字节;第二个参数为高位字节

err = WSAStartup( wVersionRequested, &wsaData );//对winsock DLL(动态链接库文件)进行初始化,协商Winsock的版本支持,并分配必要的资源。
if ( err != 0 )
{
return 0;
}

if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 )//LOBYTE()取得16进制数最低位;HIBYTE()取得16进制数最高(最左边)那个字节的内容
{
WSACleanup( );
return 0;
}

SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//创建socket。AF_INET表示在Internet中通信;SOCK_STREAM表示socket是流套接字,对应tcp;0指定网络协议为TCP/IP

SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); //htonl用来将主机字节顺序转换为网络字节顺序(to network long)
//INADDR_ANY就是指定地址为0.0.0.0的地址,
//表示不确定地址,或“任意地址”。”
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(4000);//htons用来将主机字节顺序转换为网络字节顺序(to network short)

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//将本地地址绑定到所创建的socket上,以使在网络上标识该socket

listen(sockSrv,5);//socket监听,准备接受连接请求。

SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);

while(1)
{
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);//为一个连接请求提供服务。addrClient包含了发出连接请求的客户机IP地址信息;返回的新socket描述服务器与该客户机的连接

char sendBuf[50];
sprintf(sendBuf,"Welcome %s to here!",inet_ntoa(addrClient.sin_addr));//inet_ntoa网络地址转换转点分十进制的字符串指针
send(sockConn,sendBuf,strlen(sendBuf)+1,0);

char recvBuf[50];
recv(sockConn,recvBuf,50,0);
printf("%s\n",recvBuf);

closesocket(sockConn);
Sleep(2000);//2000毫秒
}
WSACleanup();
return 0;
}

//////////
#include <stdio.h>
#include <Winsock2.h>

#pragma comment( lib, "ws2_32.lib" )

void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1 );//第一个参数为低位字节;第二个参数为高位字节

err = WSAStartup( wVersionRequested, &wsaData );//对winsock DLL(动态链接库文件)进行初始化,协商Winsock的版本支持,并分配必要的资源。
if ( err != 0 )
{
return;
}

if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 )//LOBYTE()取得16进制数最低位;HIBYTE()取得16进制数最高(最左边)那个字节的内容
{
WSACleanup( );
return;
}
for(int index=0;;index++)
{
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addrClt;//需要包含服务端IP信息
addrClt.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");// inet_addr将IP地址从点数格式转换成网络字节格式整型。
addrClt.sin_family=AF_INET;
addrClt.sin_port=htons(4000);

connect(sockClient,(SOCKADDR*)&addrClt,sizeof(SOCKADDR));//客户机向服务器发出连接请求
char recvBuf[50];
recv(sockClient,recvBuf,50,0);
printf("my reply is : %s\n",recvBuf);

char sendBuf[50];
sprintf(sendBuf,"%3d,",index);
strcat(sendBuf,"server node of: yaopeng");
send(sockClient,sendBuf,strlen(sendBuf)+1,0);

closesocket(sockClient);
Sleep(2000);
}
WSACleanup();
}

/////////////////////////////////////

可用简单代码
#include <iostream>
#include <cstdio>
#include <WinSock2.h>
using namespace std;

char send_buf[100];
char recv_buf[100];

int client = 0;
int reclient = 0;

int main()
{
WORD w_version_request;
WSADATA wsa_data;
int error;
w_version_request = MAKEWORD(1, 1);
error = WSAStartup(w_version_request, &wsa_data);

if (error != 0)
{
cout << "动态库初始化失败!\n";
system("pause");
return -1;
}

if (LOBYTE(wsa_data.wVersion) != 1 || HIBYTE(wsa_data.wVersion) != 1)
{
WSACleanup();
system("pause");
return -1;
}
SOCKET sock_srv = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in addr_srv;
addr_srv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addr_srv.sin_family = AF_INET;
addr_srv.sin_port = htons(4000);

bind(sock_srv, (SOCKADDR*)&addr_srv, sizeof(SOCKADDR));
listen(sock_srv, 5);

SOCKADDR_IN addr_client;
int len = sizeof(SOCKADDR);

while (1)
{
SOCKET sock_conn;
sock_conn = accept(sock_srv, (SOCKADDR*)&addr_client, &len);
if(sock_conn)
{
client++;
sprintf_s(send_buf, "welcome %d to here!\n", client);
send(sock_conn, send_buf, strlen(send_buf)+1,0);
}

if (recv(sock_conn, recv_buf, 100, 0))
{
cout << recv_buf << endl;
}
//cout << sock_conn<<" "<< addr_client.sin_addr.S_un.S_addr << endl;
}
WSACleanup();
return 0;
}

////////
#include <stdio.h>
#include <Winsock2.h>
#include <iostream>
using namespace std;

#pragma comment( lib, "ws2_32.lib" )

void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1 );//第一个参数为低位字节;第二个参数为高位字节

err = WSAStartup( wVersionRequested, &wsaData );//对winsock DLL(动态链接库文件)进行初始化,协商Winsock的版本支持,并分配必要的资源。
if ( err != 0 )
{
return;
}

if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 )//LOBYTE()取得16进制数最低位;HIBYTE()取得16进制数最高(最左边)那个字节的内容
{
WSACleanup( );
return;
}
for(int index=0;;index++)
{
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addrClt;//需要包含服务端IP信息
addrClt.sin_addr.S_un.S_addr=inet_addr("192.168.155.3");// inet_addr将IP地址从点数格式转换成网络字节格式整型。
addrClt.sin_family=AF_INET;
addrClt.sin_port=htons(4000);

connect(sockClient,(SOCKADDR*)&addrClt,sizeof(SOCKADDR));//客户机向服务器发出连接请求
char recvBuf[50];
recv(sockClient,recvBuf,50,0);
//printf("my reply is : %d\n",sockClient);

char sendBuf[50];
//sprintf(sendBuf,"%d",sockClient);
//strcat(sendBuf,"server node of: yaopeng");
if(cin>>sendBuf)
send(sockClient,sendBuf,strlen(sendBuf)+1,0);

closesocket(sockClient);
Sleep(2000);
}
WSACleanup();
}

int date=20160812;
char file_name[100];
sprintf(file_name,"时间:%d.txt",date);
myfile.open(file_name,ios::out);
文件名应该是:时间:20160812.txt

///////////////////////////////////
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  socket 测试 word 通信