胡漢三66 的學(xué)生作業(yè):
tcpsocket.h
#ifndef __TCP_SOCKET_H_
#define __TCP_SOCKET_H_
#include
#include
#include
#include
#include
#include
#include
#include
// 用于創(chuàng)建 tcp server socket
extern int create_tcp_server_socket(const char *ip,unsigned short port);
// 用于創(chuàng)建 tcp client socket
extern int create_tcp_client_socket(const char *ser_ip,unsigned short svr_port);
// 用于(服務(wù)器)與客戶端建立連接
extern int wait_for_connect(int sockfd,struct sockaddr_in *cli_addr);
// 顯示連接客戶端的地址信息
extern void show_tcp_network_address(struct sockaddr_in *sockaddr);
// 發(fā)送數(shù)據(jù)
extern ssize_t tcp_send_pack(int sockfd,const void *buf,size_t len);
// 接收數(shù)據(jù)
extern ssize_t tcp_recv_pack(int sockfd,void *buf,size_t len);
#endif
tcpsocket.c
#include "tcpsocket.h"
#include "debug.h"
#define BACKLOG 10 // 監(jiān)聽隊(duì)列最大值
// 用于創(chuàng)建 tcp server socket
int create_tcp_server_socket(const char *ip,unsigned short port)
{
int sfd,ret;
struct sockaddr_in svr_addr;
socklen_t len = sizeof(struct sockaddr_in);
// 1.創(chuàng)建套接字
sfd = socket(AF_INET,SOCK_STREAM,0);
if(sfd == -1){
DEBUG_INFO("[ERROR] Failed to socket : %s\n",strerror(errno));
return -1;
}
bzero(&svr_addr,sizeof(struct sockaddr_in)); // 指針指向空間初始化(清零)
svr_addr.sin_family = AF_INET; // 協(xié)議族
svr_addr.sin_port = htons(port); // 端口
svr_addr.sin_addr.s_addr = inet_addr(ip); // IP
// 2.綁定ip地址與端口號(hào)
ret = bind(sfd,(const struct sockaddr *)&svr_addr,sizeof(struct sockaddr_in));
if(ret == -1){
DEBUG_INFO("[ERROR] Failed to bind : %s\n",strerror(errno));
return -1;
}
// 3.建立監(jiān)聽隊(duì)列
ret = listen(sfd,BACKLOG);
if(ret == -1){
DEBUG_INFO("[ERROR] Failed to listen : %s\n",strerror(errno));
return -1;
}
return sfd;
}
// 用于創(chuàng)建 tcp client socket
int create_tcp_client_socket(const char *svr_ip,unsigned short svr_port)
{
int sfd,ret;
struct sockaddr_in svr_addr;
// 1.創(chuàng)建套接字
sfd = socket(AF_INET,SOCK_STREAM,0);
if(sfd == -1){
DEBUG_INFO("[ERROR] Failed to socket : %s\n",strerror(errno));
return -1;
}
bzero(&svr_addr,sizeof(struct sockaddr_in)); // 指針指向空間初始化(清零)
svr_addr.sin_family = AF_INET; // 協(xié)議族
svr_addr.sin_port = htons(svr_port); // 端口
svr_addr.sin_addr.s_addr = inet_addr(svr_ip); // IP
ret = connect(sfd,(const struct sockaddr *)&svr_addr,sizeof(struct sockaddr_in)); // 客戶端 連接 服務(wù)器
if(ret == -1){
DEBUG_INFO("[ERROR] Failed to connect : %s\n",strerror(errno));
return -1;
}
return sfd;
}
// 用于(服務(wù)器)與客戶端建立連接
int wait_for_connect(int sockfd,struct sockaddr_in *cli_addr)
{
int cfd;
socklen_t len = sizeof(struct sockaddr_in);
cfd = accept(sockfd,(struct sockaddr *)cli_addr,&len);
if(cfd == -1){
DEBUG_INFO("[ERROR] Failed to accept : %s\n",strerror(errno));
return -1;
}
return cfd;
}
// 顯示連接客戶端的地址信息
void show_tcp_network_address(struct sockaddr_in *sockaddr)
{
printf("ip : %s\n",inet_ntoa(sockaddr->sin_addr));
printf("port : %d\n",ntohs(sockaddr->sin_port));
}
// 發(fā)送數(shù)據(jù)
ssize_t tcp_send_pack(int sockfd,const void *buf,size_t len)
{
return send(sockfd,buf,len,0);
}
// 接收數(shù)據(jù)
ssize_t tcp_recv_pack(int sockfd,void *buf,size_t len)
{
return recv(sockfd,buf,len,0);
}