服务端:
#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;
}