练习
实现 tcp 客户端 socket 创建与等待连接接口设计
实现 tcp 客户端 socket 创建与等待连接接口设计
登录后即可发布作业,立即登录
全部作业 58
debug.h
#ifndef _DEBUG_H_
#define _DEBUG_H_
/*
__FILE__:输出文件名
__FUNCTION__:输出函数名
__LINE__:输出行号
}while:括号要与while连接在一起
*/
#define DEBUG_INFO(args...) do{ \
char b__[1024];\
sprintf(b__,args);\
fprintf(stderr,"[%s,%s,%d] : %s", __FILE__ , __FUNCTION__ ,__LINE__ ,b__); \
}while(0)
#endif
tcp_socket.h
#ifndef __TCP_SOCKET_H_
#define __TCP_SOCKET_H_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
// 创建并初始化 tcp 服务器 socket
extern int create_tcp_server_socket(const char *ip,unsigned short port);
// 用于创建tcp客户端连接
extern int create_tcp_client_socket(const char *server_ip,unsigned short server_port);
//等待与客户端连接
extern int wait_for_connect(int sockfd, struct sockaddr_in* client_addr);
#endif
tcp_socket.c
#include "tcp_socket.h"
#include "debug.h"
#define BACKLOG 10
int create_tcp_server_socket(const char *ip,unsigned short port)
{
int sfd;
int ret;
struct sockaddr_in server_addr;
socklen_t len = sizeof(struct sockaddr_in);
//1、创建套接字
sfd = socket(AF_INET, SOCK_STREAM, 0);
if(sfd == -1)
{
DEBUG_INFO("[ERROR] socket:%s\n", strerror(errno));
return -1;
}
bzero(&server_addr, len);
//地址族/协议族 与socket函数第一个参数相同
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
server_addr.sin_addr.s_addr = inet_addr(ip);
//2、绑定ip,端口号
ret = bind(sfd, (const struct sockaddr *) &server_addr, len);
if(ret == -1)
{
DEBUG_INFO("[ERROR] bind():%s\n", strerror(errno));
return -1;
}
//3、设置套接字为监听状态,建立监听队列,如果服务端处理不过来的话,会把客户端连接请求缓存在监听队列里,如果超过最大队列数量,那么会被拒绝连接
ret = listen(sfd, BACKLOG);
if(ret == -1)
{
DEBUG_INFO("[ERROR] listen():%s\n", strerror(errno));
return -1;
}
return sfd;
}
int create_tcp_client_socket(const char *server_ip,unsigned short server_port)
{
int sfd;
int ret;
struct sockaddr_in server_addr;
//1、创建套接字
sfd = socket(AF_INET, SOCK_STREAM, 0);
if(sfd == -1)
{
DEBUG_INFO("[ERROR] socket():%s\n", strerror(errno));
return -1;
}
bzero(&server_addr, sizeof(struct sockaddr_in));
//地址族/协议族 与socket函数第一个参数相同
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(server_port);
server_addr.sin_addr.s_addr = inet_addr(server_ip);
ret = connect(sfd, (const struct sockaddr *) &server_addr, sizeof(struct sockaddr_in));
if(ret == -1)
{
DEBUG_INFO("[ERROR] connect():%s\n", strerror(errno));
return -1;
}
return sfd;
}
int wait_for_connect(int sockfd, struct sockaddr_in* client_addr)
{
int cfd;
socklen_t len = sizeof(struct sockaddr_in);
cfd = accept(sockfd, (struct sockaddr *)client_addr, &len);
if(cfd == -1)
{
DEBUG_INFO("[ERROR] accept():%s\n", strerror(errno));
return -1;
}
return cfd;
}