最近为了应付学校的课程接触了一些socket编程,记录一下简单的socket通信。
关于socket,不懂的话可以去百度一下。
如果实现两台内网的通信的话,首先得有处于公网IP下的服务器代码作为数据交换的桥梁。
我们服务端与客户端代码都是用纯C语言写的。
接下来是服务器代码:
#include <winsock2.h>
#include <stdio.h>
int main()
{
WORD a;
WSADATA b;
SOCKET sockfd,newfd;
int port,listnum,c;
struct sockaddr_in c_addr,d_addr;
char buf[1024];
//调用WSAStartup
a = MAKEWORD(2,2);
WSAStartup(a,&b);
//建立socket
sockfd = socket(AF_INET,SOCK_STREAM,0);
//设置端口
port = 4567;
//设置ip
memset(&c_addr,0,sizeof(c_addr));
c_addr.sin_family = AF_INET;
c_addr.sin_port = htons(port);
c_addr.sin_addr.s_addr = inet_addr("0.0.0.0");//字符ip转换成网络序列ip
//设置侦听队列的长度
listnum = 3;
//建立套接字
bind(sockfd,(struct sockaddr*)&c_addr,sizeof(struct sockaddr));
//侦听本地端口
listen(sockfd,listnum);
c = sizeof(d_addr);
newfd = accept(sockfd,(struct sockaddr*)&d_addr,&c);
//开始通信
while(1)
{
memset(buf,0,1024);
fgets(buf,1024,stdin);
send(newfd,buf,1024,0);
if(!strncmp(buf,"quit",4))
{
printf("通信结束");
break;
}
memset(buf,0,1024);
recv(newfd,buf,1024,0);
printf("收到:%s",buf);
}
return 0;
}
然后是客户端代码:
#include <winsock2.h>
#include <stdio.h>
int main()
{
WORD a;
char buff[] = "127.0.0.1";
WSADATA b;
SOCKET sockfd;
int port;
struct sockaddr_in c_addr;
char buf[1024];
//调用WSAStartup
a = MAKEWORD(2,2);
WSAStartup(a,&b);
//建立Socket
sockfd = socket(AF_INET,SOCK_STREAM,0);
//设置端口
port = 4567;
//设置ip
memset(&c_addr,0,sizeof(c_addr));
c_addr.sin_family = AF_INET;
c_addr.sin_port = htons(port);
c_addr.sin_addr.s_addr = inet_addr(buff);//字符ip转换成网络序列ip
//连接服务器
connect(sockfd,(struct sockaddr*)&c_addr,sizeof(struct sockaddr));
//开始通信
while(1)
{
memset(buf,0,1024);
recv(sockfd,buf,1024,0);
printf("收到:%s",buf);
memset(buf,0,1024);
fgets(buf,1024,stdin);
send(sockfd,buf,1024,0);
//结束通信,客户端发送“quit”
if(!strncmp(buf,"quit",4))
{
printf("通信结束");
break;
}
}
return 0;
}
最后说一下windows下的socket编程需要引入一个动态链接库文件(ws2_32.dll),否则会无法编译。库文件我附加在后面。引入这个ws2_32.dll文件以后代码就可以直接编译运行了,在这里我就不放效果图了,需要的大佬自己测试。哪里有问题的话,告诉我就好。
正在设计C++语言的socket编程(应付学校的课程),过几周的话应该会发布一个C++的多线程聊天类的源码,时间够的话会在做一个界面。欢迎各位大佬指教。