您的位置:首页 > 运维架构 > Linux

Linux socket编程 服务器 客户端

2011-06-25 15:56 531 查看
根据网上的程序修改的,感谢!

另外有个Linux网络调试工具,tcpdump,类似xp上的wireshark,使用介绍:
http://tcpdump.anheng.com.cn/news/24/586.html


服务器端:

/* socksrv.c*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h> /* for struct sockaddr_in*/
#define SRC_IP   "127.0.0.1"
#define BACKLOG 10
#define MYPORT  2000
int main()
{
	char *addr;
	int sockfd;
	int connfd;
	struct sockaddr_in my_addr, their_addr;
	int res;
	int sin_size;
	char *buf;
	sockfd = socket(AF_INET, SOCK_STREAM, 0);        
	if (sockfd == -1) {
		perror("socket");
		exit(1);
	}
	// Init server socket addr
	my_addr.sin_family = AF_INET;                
	my_addr.sin_port = htons(MYPORT);            
	my_addr.sin_addr.s_addr = inet_addr(SRC_IP); 
	bzero(&(my_addr.sin_zero), 8);              
	res = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr));
	if (res == -1) {
		perror("bind");
		exit(1);
	}
	res = listen(sockfd, BACKLOG);            
	if (res == -1) {
		perror("listen");
		exit(1);
	}
	sin_size = sizeof(struct sockaddr_in);
	buf = (char *)malloc(255);
	if (buf == NULL) {
		printf("malloc failed/n");
		exit(1);
	}
	printf("server is on.../n");
	if( (connfd = accept(sockfd, (void *)&their_addr, &sin_size) ) < 0 )
		perror("accept()");
	printf("Client IP addr: %s, port:%d/n", inet_ntoa(their_addr.sin_addr.s_addr), (their_addr.sin_port));
	while(1){
		if( (res = recv(connfd, buf, 255, 0)) < 0 ){
			perror("recv()");
			exit(1);
		}
		if(strcmp(buf, "quit") == 0)
			break;
		printf("Client:%s/n", buf);
	}
	close(connfd);
	close(sockfd);
	free(buf);
	return 0;
}




客户机端:

/* sockclnt.c*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h> /*for struct sockaddr_in*/
#define DEST_IP   "127.0.0.1"
#define DEST_PORT 2000
#define BUFSIZE	255
int main()
{
	int res;
	int sockfd;
	struct sockaddr_in dest_addr;
	char msg[10];
	int len, bytes_sent;
	sockfd = socket(AF_INET, SOCK_STREAM, 0);
	if (sockfd == -1) {
		perror("socket()");
		exit(1);
	}
	dest_addr.sin_family = AF_INET;                 
	dest_addr.sin_port = htons(DEST_PORT);          
	dest_addr.sin_addr.s_addr = inet_addr(DEST_IP); 
	bzero(&(dest_addr.sin_zero), 8);                
	res = connect(sockfd, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr_in));
	if (res == -1) {
		perror("connect()");
		exit(1);
	}
	while(fgets(msg, BUFSIZE, stdin) != NULL){
		if( (send(sockfd, msg,	BUFSIZE, 0))<0)
			perror("send()");
		printf("Input: %s", msg);
	}   
	close(sockfd);
}


可以实现,客户机一直发送,服务器一直接收数据,原理网上的程序是只发一次。

现在这个还有个问题,退出只能Ctrl C,如果客户机先退出,服务器一直接收数据,不知道什么原因?

还有,想实现一个聊天功能,那么服务器也要想客户机发送,服务器还得一直接收数据,可能要使用多线程,这个要再学习。

另外,还有一个疑问,程序中设置端口号为2000,但是服务器每次得到的端口号不知2000,而且还变化,不知道什么原因?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: