SOCKET_C/S_CODE
来源:互联网 发布:美工图片处理 编辑:程序博客网 时间:2024/05/22 16:45
服务端:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
/**
struct sockaddr {
ushort_t sa_family; // address family
char sa_data[14]; // up to 14 bytes of direct address
};
*/
#include <netinet/in.h>
/**
struct sockaddr_in {
u_short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
*/
#define SERVPORT 4444 /* 服务器监听端口号 */
#define BACKLOG 10 /* 最大同时连接请求数 */
int getAtoi(char *str)
{
printf("in_str:[%s]/n", str);
int i=0;
while(i < strlen(str))
{
if(str[i]<48 || str[i]>57)
{
return -1;
}
i++;
}
return atoi(str);
}
int main(int argc, char* argv[])
{
int listen_sockFD; /* 服务器监听socket */
struct sockaddr_in serv_addr; /* 服务器本机地址 */
/* 建立socket */
listen_sockFD=socket(AF_INET, SOCK_STREAM, 0);
if(listen_sockFD == -1)
{
printf("Create socket error: %d/n", errno);
exit(1);
}
memset(&serv_addr, 0x00, sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(SERVPORT);
serv_addr.sin_addr.s_addr=INADDR_ANY; /* 可自动填入本机IP */
memset(serv_addr.sin_zero, 0x00, sizeof(serv_addr.sin_zero));
/* 强制类型转换sockaddr_in到sockaddr */
if(bind(listen_sockFD, (struct sockaddr*)&serv_addr, sizeof(struct sockaddr)) != 0)
{
printf("Bind socket error: %d/n", errno);
exit(1);
}
/* 监听 */
if(listen(listen_sockFD, BACKLOG) != 0)
{
printf("Listen socket error: %d/n", errno);
exit(1);
}
int conn_sockFD; /* 数据传输socket */
struct sockaddr_in client_addr; /* 客户端地址信息 */
socklen_t clientLen=sizeof(client_addr); /* 客户端地址长度 */
char buff[4096]; /* 数据存储区 */
int recvLen=0; /* 数据长度 */
while(1)
{
conn_sockFD=accept(listen_sockFD, (struct sockaddr*)&client_addr, &clientLen);
if(conn_sockFD == -1)
{
printf("Accept socket error: %d/n", errno);
exit(1);
}
/***
printf("client-family:[%d]/n", client_addr.sin_family);
printf("client-port:[%d]/n", ntohs(client_addr.sin_port));
printf("client-ip:[%d]/n", client_addr.sin_addr.s_addr);
***/
/* 收取消息包前面的4个字节的长度值 */
memset(buff, 0x00, sizeof(buff));
recvLen=recv(conn_sockFD, buff, 4, 0);
if(recvLen == -1)
{
printf("recv1 err=[%d]/n", errno);
continue;
}
printf("head_recv:[%s]---[%d]/n", buff, recvLen);
/* 以实际的长度值接收消息包 */
recvLen=getAtoi(buff);
if(recvLen == -1)
{
printf("illegal: [%s]/n", buff);
continue;
}
memset(buff, 0x00, sizeof(buff));
recvLen=recv(conn_sockFD, buff, recvLen, 0);
if(recvLen == -1)
{
printf("recv2 err=[%d]/n", errno);
continue;
}
printf("body_recv:[%s]---[%d]/n", buff, recvLen);
close(conn_sockFD);
}
close(listen_sockFD);
return 0;
}
客户端:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define SERVPORT 4444
int main(int argc, char* argv[])
{
/* 建立socket */
int sockFD;
sockFD=socket(AF_INET, SOCK_STREAM, 0);
if(sockFD == -1)
{
printf("Create socket error: %d/n", errno);
exit(1);
}
struct sockaddr_in serv_addr; /* 服务器地址 */
socklen_t serv_addr_len=sizeof(serv_addr);
memset(&serv_addr, 0x00, sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(SERVPORT);
serv_addr.sin_addr.s_addr=inet_addr("36.0.15.227");
memset(serv_addr.sin_zero, 0x00, sizeof(serv_addr.sin_zero));
/* 尝试连接服务器 */
if(connect(sockFD, (struct sockaddr*)&serv_addr, serv_addr_len) != 0)
{
printf("Connect socket error: %d/n", errno);
exit(1);
}
/* 待发送的信息 */
char *sendMsg=argv[1];
int sendLen=strlen(sendMsg);
printf("send len=[%d]/n", sendLen);
char strSend[4096];
memset(strSend, 0x00, sizeof(strSend));
sprintf(strSend, "%04d%s", sendLen, sendMsg);
/* 发送 */
sendLen=send(sockFD, strSend, strlen(strSend), 0);
if(sendLen<0)
{
printf("Send data erro: %d/n", errno);
close(sockFD);
exit(1);
}
close(sockFD);
return 0;
}
- SOCKET_C/S_CODE
- 再谈软件架构设计之业务的封装
- CSDN高手速成宝典
- 5.23 第十四天 游乐场长隆
- C++动态创建二维数组和清空cin缓冲
- 【linux】linux下su命令su cannot set groups Operation not permitted错误
- SOCKET_C/S_CODE
- 读《0 bug C/C++商用工程之道》——记录1
- C++中的不定层迭代,以若干面骰子概率问题为例
- 【Nutch】Linux下应用nutch 1.0 Web前端实现单机检索
- 【Nutch】Linux下应用nutch-1.0Web前端实现HDFS数据检索
- 【Linux】配置linux主机使得可以使用Xmanager的xbrowser登陆图形界面
- MFC中VERIFY与ASSERT的区别
- 龟与兔
- JAVA经典书籍