您的位置:首页 > 理论基础 > 计算机网络

linux下socket实现TCP通信的简单程序接口封装

2009-07-22 09:12 971 查看
帮朋友写的一个linux通信程序的简单接口。。

删了怪可惜的,发上来好了~~



程序提供TCP连接的消息发送

1:

server.c server.h为服务器端程序。

程序执行后,已共享方式绑定到主机端口8888,等待客户机连接,当有客户连接时,发送"connect ok"到客户机,

然后关闭此客户连接,继续等待下一用户。

去掉主程序文件server.c中main函数和错误处理函数,此程序可当作封包使用,提供网络主机设置,绑定,等待连接,发送消息等功能。

详见注释;

2:

client.c为客户机程序

详见注释;



server.h



/*************************************
programme name: cui bo

E-mail: freecunix@gmail.com

date: 20090716

NET-TCP pack

**************************************/
#ifndef _SERVER_H_
#define _SERVER_H_

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>

#define USER_NUMBER 10 //最大连接数

extern int SERV_PORT;//管理员端口

/*错误处理*/
int ServerSysError(char *str);
int ServerUserError(char *str);
void NotNetLink(int signo);//网络断开或异常信号捕捉

/*
建立服务器端socket接口,绑定套接字到本机地址,返回可用套接字
int SERV_PORT - 监听端口号
正确返回可用的套接口,错误返回-1

绑定放是:共享方式
采用协议:Internet网络地址(IPV4),稳定可靠的连接,双向通信方式(TCP协议)
*/
int SetSocket(int SERV_PORT);
/*
允许客户机连接到sockfd,最多可以接受USER_NUMBER个客户机连接(在线)
int sockfd - 可用的套接口地址
正确返回0,否则返回-1
*/
int LanuchServer(int *sockfd);
/*
向客户端发送信息
const char* msg - 要发送的消息
int client_fd - 发送到指定客户机地址
错误返回-1,正确返回发送字节数

*/
int SendMsg(const char* msg, int client_fd);

#endif






server.c



#include "server.h"

int SERV_PORT = 8888;//端口号

int main(void)
{
	int sockfd;
	int clientfd;
	int sin_size;
	int i;

	/*客户地址信息*/
	struct sockaddr_in mote_addr;
	
	/*创建套接字、监听端口,绑定到本机,等待管理员,开始服务*/
	sockfd = SetSocket(SERV_PORT);
	if(sockfd == -1)
		ServerSysError("Socket Create failed or Bind Error!/n");
	LanuchServer(&sockfd);
	if(sockfd == -1)
		ServerSysError("Listen Error!/n");
	/*捕捉网络断开发送异常等*/
	signal(SIGPIPE, NotNetLink);

	/*循环等待客户连接*/
	while(1)
	{
		fprintf(stdout, "%s/n", "wait client....");
		fflush(stdout);
		/*阻塞等待连接到达*/
		sin_size = sizeof(struct sockaddr_in);
		if((clientfd = accept(sockfd, (struct sockaddr*)&mote_addr, &sin_size)) == -1)
		{
			ServerUserError("a user Accept error.");
			continue;
		}
		sleep(1);
		/*显示客户信息*/
		fprintf(stdout, "Received a connection from %s/n", inet_ntoa(mote_addr.sin_addr));
		fflush(stdout);
		/*发送确认信息到客户*/
		if(SendMsg("connect ok", clientfd) == -1)
		{
			ServerUserError("Send Msg to client Error!/n");
			close(clientfd);
			continue;
		}
		close(clientfd);//关闭连接
	}
	close(sockfd);//关闭端口的监听

	return 0;	
}

/*错误处理*/
int ServerSysError(char *str)
{
	fprintf(stdout, "server-erro@servertime-%ld:%s /n", time(NULL), str);
	fflush(stdout);
	exit(1);
}
int ServerUserError(char *str)
{
	fprintf(stdout, "server-user@servertime-%ld:%s /n", time(NULL), str);
	fflush(stdout);
	return 0;
}
void NotNetLink(int signo)//信号处理
{
	fprintf(stdout, "server-signo@servertime-%ld: :Signal is %d /n", time(NULL), signo);
	fflush(stdout);
    signal(signo, NotNetLink);
}

/*
建立服务器端socket接口,绑定套接字到本机地址,返回可用套接字
int SERV_PORT - 监听端口号
正确返回可用的套接口,错误返回-1

绑定放是:共享方式
采用协议:Internet网络地址(IPV4),稳定可靠的连接,双向通信方式(TCP协议)
*/
int SetSocket(int SERV_PORT)
{
	int sockfd;
	int opt;
	struct sockaddr_in servaddr;

	if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) 
	{
		return -1;
	}
	bzero(&servaddr, sizeof(servaddr));//置地址&servaddr的前sizeof(servaddr)个字节为零
	opt = SO_REUSEADDR;
	setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));//同一套接口可被多个程序绑定
	servaddr.sin_family = AF_INET;
	servaddr.sin_port = htons(SERV_PORT);
	servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

	if(bind(sockfd, (const struct sockaddr *)&servaddr, sizeof(servaddr)) == -1)
	{
		close(sockfd);
		return -1;
	}

	return sockfd;
}

/*
允许客户机连接到sockfd,最多可以接受USER_NUMBER个客户机连接(在线)
int sockfd - 可用的套接口地址
正确返回0,否则返回-1
*/
int LanuchServer(int *sockfd)
{
	if(listen(*sockfd, USER_NUMBER) == -1)
	{
		return -1;
	}
	fflush(stdout);
	return 0;
}

/*
向客户端发送信息
const char* msg - 要发送的消息
int client_fd - 发送到指定客户机地址
错误返回-1,正确返回发送字节数

*/
int SendMsg(const char* msg, int client_fd)
{
	int len;	

	if((len = send(client_fd, msg, strlen(msg), 0)) == -1)
	{
		return -1;
	}
	return len;
}








client.c



#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
#include <time.h>
#include <unistd.h> 

//#define PORT 8888
/*错误处理*/
void syserror(char *p);

int main(int argc, char **argv)
{
	int sockfd;
	struct sockaddr_in servaddr;
	char tcom[100];
	int i,len;
	char *charp;

	/*要求参数*/
	if(argc!=3){syserror("myc <IPaddress> <prot>");}

	/*建立套接字,帮定到主机*/
	sockfd = socket(AF_INET, SOCK_STREAM, 0);
	bzero(&servaddr,sizeof(servaddr));
	/*设置套接字*/
	servaddr.sin_family=AF_INET;
	charp = argv[2];
	for(i=0; *charp; charp++)
	{
		i += *charp - '0';
		i *= 10;
	}
	i /= 10;
	servaddr.sin_port=htons(i);
	inet_pton(AF_INET, argv[1], &servaddr.sin_addr);

	/*连接到服务器*/
	connect(sockfd, (const struct sockaddr*)&servaddr, sizeof(servaddr));

	/*阻塞方式读服务器反馈并处理*/
	if((len = recv(sockfd, tcom, 99, 0)) == -1)
	{
		syserror("link server error.");
	}
	tcom[len]='/0';
	if(strcmp(tcom, "connect ok"))
	{
		puts(tcom);
		syserror("link server exception.");
	}
	printf("link state:%s/n", tcom);

	return 0;
}

void syserror(char *p)
{
	puts(p);
	exit(1);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: