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

Linux socket编程 服务器 客户端

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

另外有个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,而且还变化,不知道什么原因?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: