慕神4583458 的学生作业:
tcpsocket.h
#ifndef __TCPSOCKET_H__
#define __TCPSOCKET_H__
#include /* See NOTES */
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define BACKLOG 20
extern int create_tcp_server_socket(const char *ip, unsigned short port);
extern int create_tcp_client_socket(const char *svr_ip,const unsigned short svr_port);
extern int wait_for_connect(int sfd,struct sockaddr_in *cli_addr);
extern void show_tcp_network_address(struct sockaddr_in *sockaddr);
extern ssize_t tcp_send_pack(int socketfd, void *buf, ssize_t len);
extern ssize_t tcp_recv_pack(int socketfd, char *buf, ssize_t len);
#endif
tcpsocket.c
#include "debug.h"
#include "tcpsocket.h"
int create_tcp_server_socket(const char *ip, unsigned short port) {
int socketfd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr_in;
if (socketfd == -1) {
DEBUG_INFO("[ERROR]: %s", strerror(errno));
return -1;
}
addr_in.sin_family = AF_INET;
addr_in.sin_port = htons(port);
addr_in.sin_addr.s_addr = inet_addr(ip);
int ret = bind(socketfd, (struct sockaddr *)&addr_in, sizeof(addr_in));
if (ret == -1) {
DEBUG_INFO("[ERROR]: %s", strerror(errno));
return -1;
}
ret = listen(socketfd, BACKLOG);
if (ret == -1) {
DEBUG_INFO("[ERROR]: %s", strerror(errno));
return -1;
}
return socketfd;
}
int create_tcp_client_socket(const char *svr_ip,const unsigned short svr_port) {
int socketfd = socket(AF_INET, SOCK_STREAM, 0);
if (socketfd == -1)
{
DEBUG_INFO("[ERROR]: %s", strerror(errno));
return -1;
}
struct sockaddr_in addr_in;
addr_in.sin_family = AF_INET;
addr_in.sin_port = htons(svr_port);
addr_in.sin_addr.s_addr = inet_addr(svr_ip);
int ret = connect(socketfd, (struct sockaddr *)&addr_in, sizeof(addr_in));
if (ret == -1)
{
DEBUG_INFO("[ERROR]: %s", strerror(errno));
return -1;
}
DEBUG_INFO("[INFO]: Connect %s success\n", svr_ip);
return socketfd;
}
int wait_for_connect(int sfd,struct sockaddr_in *cli_addr) {
socklen_t len = sizeof(struct sockaddr_in);
int cfd = accept(sfd, (void *)cli_addr, &len);
if (cfd == -1) {
DEBUG_INFO("[ERROR]: %s", strerror(errno));
return -1;
}
return cfd;
}
void show_tcp_network_address(struct sockaddr_in *sockaddr) {
printf("ip = %s port = %d\n", inet_ntoa(sockaddr->sin_addr), ntohs(sockaddr->sin_port));
}
ssize_t tcp_send_pack(int socketfd, void *buf, ssize_t len) {
return send(socketfd, (void *)&buf, len, 0);
}
ssize_t tcp_recv_pack(int socketfd, char *buf, ssize_t len) {
return recv(socketfd, &buf, len, 0);
}
client.c
#include "tcpsocket.h"
int main(int argc, char *argv[]) {
if (argc != 3) {
fprintf(stderr, " %s ip port", argv[0]);
return -1;
}
int socketfd;
socketfd = create_tcp_client_socket(argv[1], atoi(argv[2]));
if (socketfd == -1) return -1;
close(socketfd);
}
server.c
#include "tcpsocket.h"
int main(int argc, char *argv[]) {
if (argc != 3) {
fprintf(stderr, " %s ip port", argv[0]);
return -1;
}
int socketfd;
socketfd = create_tcp_server_socket(argv[1], atoi(argv[2]));
if (socketfd == -1) return -1;
struct sockaddr_in cli_addr;
int cfd;
bzero(&cli_addr,sizeof(struct sockaddr_in));
cfd = wait_for_connect(socketfd, &cli_addr);
if (cfd == -1) return -1;
show_tcp_network_address(&cli_addr);
close(socketfd);
close(cfd);
return 0;
}