socket网络编程之一:客户端和服务器端接口函数
来源:互联网 发布:淘宝货到付款好不好 编辑:程序博客网 时间:2024/04/29 02:26
以下为winsock。
1. socket网络编程分为客户端和服务器端,客户端发送请求,服务器端进行应答;
建立连接时,服务器端绑定端口监听(bind&listen),客户端发送连接请求(connect),然后服务器端接受请求accept,至此客户端和服务器端可以收发消息。
需要注意:
1)创建socket前需要调用WSAStartup,对socket进行初始化。
2)服务器端的accept函数,第三个参数addrlen既是输出,也是输入参数,所以需要有初值sizeof(sockaddr);
accept(SOCKET s, struct sockaddr FAR * addr,int FAR * addrlen);
2. 客户端的几个API:
初始化socket:
wVersionRequested = MAKEWORD( 2, 0 );
WSAStartup(wVersionRequested , &wsaData);
创建socket:
fd = socket(AF_INET,SOCK_STREAM,0);
连接服务器:
memset(&serverAddr,0,sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(800);
serverAddr.sin_addr.S_un.S_addr = inet_addr("192.168.0.22");
connfd = connect(clientfd,(sockaddr *)&serverAddr,sizeof(sockaddr));
发送消息:
send(fd,pBuf,10,0);
关闭socket:
closesocket(clientfd);
3.服务器端的几个API:
初始化socket:
wVersionRequested = MAKEWORD( 2, 0 );
WSAStartup(wVersionRequested , &wsaData);
创建socket:
fd = socket(AF_INET,SOCK_STREAM,0);
绑定端口bind():
memset(&serverAddr,0,sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(800);
serverAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
bind(serverfd,(sockaddr *)&serverAddr,sizeof(sockaddr));
监听端口listen:
listen(serverfd,1024);
connfd = connect(clientfd,(sockaddr *)&serverAddr,sizeof(sockaddr));
接受连接accept:
addrLen = sizeof(sockaddr); //需注意,addrLen是输入输入函数,必须先赋值再传入accept。
connfd = accept(serverfd,(sockaddr *)&clientAddr,&addrLen);
接收消息recv:
recv(connfd,buf,100,0); //此处socket用的是connfd.
关闭socket:
closesocket(fd);
4.客户端程序:
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib ")
int main()
{
int clientfd=0;
int connfd =0;
int ret =0;
struct sockaddr_in serverAddr;
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD( 2, 0 );
if (WSAStartup(wVersionRequested , &wsaData)!=0)
{
printf("Winsock Initialization failed./n");
exit(0);
};
clientfd = socket(AF_INET,SOCK_STREAM,0);
if(clientfd <0)
{
printf("/r/ncreate socket error: %d",clientfd);
return -1;
}
else
{
printf("/r/ncreate socket success,socket: %d",clientfd);
}
memset(&serverAddr,0,sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(800);
serverAddr.sin_addr.S_un.S_addr = inet_addr("192.168.0.22");
connfd = connect(clientfd,(sockaddr *)&serverAddr,sizeof(sockaddr));
if(connfd < 0 )
{
printf("/r/nconnect socket fail,connfd: %d/r/n",connfd);
return -1;
}
else
{
printf("/r/nconnect socket success,connfd: %d",connfd);
}
//sendto(clientfd,pBuf,ucLen,(sockaddr *)&serverAddr,sizeof(sockaddr));
char pBuf[10] = "123456789";
send(clientfd,pBuf,10,0);
closesocket(clientfd);
return 0;
}
5.服务器端程序:
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib ")
int main()
{
int serverfd=0;
int connfd =0;
int ret =0;
struct sockaddr_in serverAddr;
struct sockaddr_in clientAddr;
int addrLen = 0;
char buf[100];
char ucLen;
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD( 2, 0 );
if (WSAStartup(wVersionRequested , &wsaData)!=0)
{
printf("Winsock Initialization failed./n");
exit(0);
};
serverfd = socket(AF_INET,SOCK_STREAM,0);
if(serverfd <0)
{
printf("/r/ncreate socket error: %d",serverfd);
return -1;
}
else
{
printf("/r/ncreate socket success,socket: %d",serverfd);
}
memset(&serverAddr,0,sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(800);
serverAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
if(bind(serverfd,(sockaddr *)&serverAddr,sizeof(sockaddr)) < 0)
{
printf("/r/nbind socket fail,serverfd: %d/r/n",serverfd);
return -1;
}
if(listen(serverfd,1024) < 0)
{
printf("/r/nbind socket fail,serverfd: %d/r/n",serverfd);
return -1;
}
do
{
addrLen = sizeof(sockaddr);
connfd = accept(serverfd,(sockaddr *)&clientAddr,&addrLen);
if(addrLen != 0 )
{
printf("/r/naccept socket success,/n/rconnfd: %u,clientIp:%s,clientPort:%u",
connfd,(inet_ntoa)(clientAddr.sin_addr),clientAddr.sin_port);
}
recv(connfd,buf,100,0);
printf("recv data: %s",buf);
}while(1);
closesocket(serverfd);
return 0;
}
6.参考书籍:
《深入理解计算机系统》十二章:网络编程
- socket网络编程之一:客户端和服务器端接口函数
- socket网络编程之一:客户端和服务器端接口函数
- socket网络编程之一:客户端和服务器端接口函数
- java网络编程之socket网络编程示例(服务器端/客户端)
- java网络编程之socket网络编程示例(服务器端/客户端)
- socket 编程 服务器端-客户端
- linux网络编程之socket(九):使用select函数改进客户端/服务器端程序
- linux网络编程之socket(九):使用select函数改进客户端/服务器端程序
- linux网络编程之socket(九):使用select函数改进客户端/服务器端程序
- 网络编程Tcp的客户端和服务器端
- UNIX网络编程----TCP客户端和服务器端
- UNIX网络编程----UDP客户端和服务器端
- Java网络编程客户端和服务器端
- 网络编程(了解客户端和服务器端原理)
- java网络编程 客户端和服务器端
- Java套接字Socket编程-----服务器端和客户端
- java socket编程 初级 服务器端和客户端 通信
- ios socket编程的客户端和服务器端通信简单实例
- CPU : 二级缓存容量
- c语言链表的建立
- 使用RegEnumValue清理IE历史记录
- 无题
- ListView 滑动的时候 变系统默认黑色,或是设置不变色
- socket网络编程之一:客户端和服务器端接口函数
- C++ vector 删除
- 纪事2011—中国,建大,家,我
- 悲催的ODBC数据源的配置、、
- 测试控制台输入程序
- jquery的基本使用语法
- 再思考如何给Flex程序瘦身,如何提高swf运行性能
- 7.IDA-创建结构体
- 第二章之“二分查找”(递归实现,练习2.3-5)