socket简单编程(C语言实现)
客户端实现
#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>
//缓冲区溢出会怎么样???
int main()
{
char Sendbuf[100]; //缓冲区
char Receivebuf[100];
int SendLen;
int ReceiveLen;
SOCKET socket_send; //套接字
SOCKADDR_IN Server_add; //服务器地址信息结构
WORD wVersionRequested; //字
WSADATA wsaData; //库版本 信息结构
int error; //表示错误
wVersionRequested=MAKEWORD(2,2);
error=WSAStartup(wVersionRequested,&wsaData); //初始化ws2_32.dll动态链接库
if (error!=0){
printf("加载套接字失败");
return 0;
}
//判断请求加载的版本号的是否符合要求
if (LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2){
WSACleanup(); //不符合,关闭套接字库
return 0;
}
// 设置服务器地址
Server_add.sin_family=AF_INET;
Server_add.sin_addr.S_un.S_addr=inet_addr("10.162.183.112");
Server_add.sin_port=htons(5000);
//创建套接字,但不需要进行bind系统自动进行
socket_send=socket(AF_INET,SOCK_STREAM,0);
//连接服务器
if(connect(socket_send,(SOCKADDR*)&Server_add,sizeof(SOCKADDR))==SOCKET_ERROR){
printf("连接失败\n");
}
//进行聊天
while(1){
printf("please enter message:");
scanf("%s",Sendbuf);
//发送数据send(sd,*buf,len,flags);
SendLen=send(socket_send,Sendbuf,100,0);
if(SendLen<0){
printf("发送失败");
}
ReceiveLen=recv(socket_send,Receivebuf,100,0);
if(ReceiveLen<0){
printf("接受失败\n");
printf("程序退出\n");
break;
}
else{
printf("Server say:%s\n",Receivebuf);
}
}
closesocket(socket_send);
WSACleanup();
return 0;
}
服务器实现
#include <stdio.h>
#include <winsock.h>
int main()
{
char Sendbuf[100];
char Receivebuf[100];
int SendLen;
int ReceiveLen;
int Length;
SOCKET socket_server;
SOCKET socket_receive;
SOCKADDR_IN Server_add;
SOCKADDR_IN Client_add;
WORD wVersionRequested;
WSADATA wsaData;
int error;
wVersionRequested=MAKEWORD(2,2);
//两个参数:
//第一个参数指明程序请求使用的WinSock版本,其中高位字节指明副版本、低位字节指明主版本.
//•十六进制整数,例如0x102表示2.1版
//第二个参数返回实际的WinSock的版本信息
//•指向WSADATA结构的指针
error=WSAStartup(wVersionRequested,&wsaData);
if(error!=0){
printf("加载套接字失败\n");
return 0;
}
if(LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2){
WSACleanup();
return 0;
}
Server_add.sin_family=AF_INET;
Server_add.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
Server_add.sin_port=htons(5000);
socket_server=socket(AF_INET,SOCK_STREAM,0);
if(bind(socket_server,(SOCKADDR*)&Server_add,sizeof(SOCKADDR))==SOCKET_ERROR){
printf("绑定失败\n");
}
printf("开始监听");
if(listen(socket_server,5)<0){
printf("监听失败\n");
}
Length=sizeof(SOCKADDR);
//服务程序调用accept函数从处于监听状态的流套接字sd的客户连接请求队列
//中取出排在最前的一个客户请求,并且创建一个新的套接字来与客户套接字创建连接通道
socket_receive=accept(socket_server,(SOCKADDR*)&Client_add,&Length);
if(socket_receive==SOCKET_ERROR){
printf("接受连接失败\n");
}
while(1)
{
printf("hello");
ReceiveLen=recv(socket_receive,Receivebuf,100,0);
if(ReceiveLen<0){
printf("接受失败\n");
printf("程序退出\n");
break;
}
else{
printf("client say:%s\n",Receivebuf);
}
printf("please enter message:\n");
scanf("%s",Sendbuf);
SendLen=send(socket_receive,Sendbuf,100,0);
if(SendLen<0){
printf("发送失败\n");
}
}
closesocket(socket_receive);
closesocket(socket_server);
WSACleanup();
return 0;
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7uTcxmBp-1576686610720)(./images/1576661974880.png)]