老师出了个关于socket编程的问题。帮忙解决!

zhangalei 2003-09-11 03:36:44
要求做到用同一个程序,在同一台,或是两台机器之间进行一对一的通信。
但是我现在通过了编译,但是达不到效果,互相之间无法通信。
那位大虾,帮忙看看,我是在美国读EE的,不懂编程,sign..
谢谢!

运行使用,
client_chat jaguar 7777 8888。
要用同一个文件。

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <signal.h>
#include <netdb.h>
#include <pthread.h>


#define MAX_PENDING 5
#define MAX_LINE 256

void *Listen(void *);
int server_port;
int client_port;
int main(int argc, char *argv[])
{
FILE *fp;
struct hostent *hp;
struct sockaddr_in sin;
char *host;
char buf[MAX_LINE];
int s;
int len;
pthread_t tid;


if (argc == 4)
{
host = argv[1];
sscanf(argv[2],"%d",&server_port);
sscanf(argv[3],"%d",&client_port);
}
else
{
fprintf(stderr, "usage: simplex-talk host\n");
exit(1);
}

pthread_create (&tid, NULL, Listen, NULL);

/* translate host name into peer"s IP address */
hp = gethostbyname(host);
if (!hp)
{
fprintf(stderr, "simplex-talk: unknow host: %s\n", host);
exit(1);
}

/* build address data structure */
bzero ((char *)&sin, sizeof(sin));
//memset((char *)&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
bcopy (hp->h_addr, (char *)&sin.sin_addr, hp->h_length);
//sin.sin_addr = * ((LPIN_ADDR)*hp->h_addr_list);
sin.sin_port = htons(client_port);

/* active open */
if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0)
{
perror("simplex-talk: socket");
exit(1);
}
while(connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0)
{

// perror("simplex-talk: connect");
// close(s);
// exit(1);
}

/* main loop: get and send lines of text */
while (fgets(buf , sizeof(buf), stdin))
{
buf[MAX_LINE -1] = '\0';
len = strlen(buf) + 1;
send(s, buf, len, 0);
}
close(s);
}


void *
Listen(void *arg)
{
struct sockaddr_in sin;
char buf[MAX_LINE];
int len;
int s, new_s;


bzero ((char *)&sin, sizeof (sin));
//memset((char *)&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(server_port);

/* setup passive open */
if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0)
{
perror("simplex-talk: socket");
exit(1);
}
if ((bind(s, (struct sockaddr *)&sin, sizeof(sin))) < 0)
{
perror("simplex-talk: bind");
exit(1);
}

listen(s, MAX_PENDING);

/* wait for connection, then receive and print text */
while (1)
{
if ((new_s = accept(s, NULL, NULL)) < 0)
{
perror("simplex-talk: accept");
exit(1);
}
while (len = recv(new_s, buf, sizeof(buf), 0))
{
if(len == -1)
break;
fputs(buf, stdout);
}
close(new_s);
}
close(s);
}
...全文
97 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ChinaPlayer 2004-03-18
  • 打赏
  • 举报
回复
mark
zhangalei 2003-09-13
  • 打赏
  • 举报
回复
顶。
zhangalei 2003-09-12
  • 打赏
  • 举报
回复
cary8060(洪丹明),谢谢你的回复,但是这个程序要求两个通信的人一定要用同一个程序。
如果你能帮我修改好的话,我可以给你加100分。

wind123(风),我一点也不懂编程,你能帮我用fork实现么?我也可以给你加分!

谢谢大家!
sunsys 2003-09-11
  • 打赏
  • 举报
回复
up
wind123 2003-09-11
  • 打赏
  • 举报
回复
为什么要用线程呢?如果在同一台机上,用fork比你用线程容易实现。并且如果是两台机子,你的程序一定不能用的。
cary8060 2003-09-11
  • 打赏
  • 举报
回复
我给你个可以实现你的要求的代码好了!不过希望你能加分!我刚刚才调试好的!
客户端:
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#define MAXBUFSIZE 1024

int main(int argv,char **argc){

struct sockaddr_in name;
int sock,n;
char buf[MAXBUFSIZE];
struct in_addr addr;

if(( sock=socket(AF_INET,SOCK_STREAM,0))<0){
printf("clinet socket error!\n");
exit(1);
}

if (inet_aton("61.137.11.5",&addr)==0 ){
printf("addr error!\n");
exit(1);
}

name.sin_family=AF_INET;
name.sin_port=htons(7099);
name.sin_addr.s_addr=addr.s_addr;

connect(sock,(struct sockaddr *)&name,sizeof(name));

n=0;
sleep(2);
while(n<10){
sprintf(buf,"send parent:%d",n++);
printf("%s\n",buf);
write(sock,buf,MAXBUFSIZE);

}
exit(0);
}
服务器端:
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#define MAXBUFSIZE 1024

int main(int argv,char **argc){

struct sockaddr_in server_addr,client_addr;
int listen_socket,conn,len,n,maxfd;
socklen_t sock_len;
char buff[MAXBUFSIZE];
fd_set rset,allset;

if ( (listen_socket=socket(AF_INET,SOCK_STREAM,0))<0){
printf("socke creat error!\n");
exit(1);
};

server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(7099);
server_addr.sin_addr.s_addr=htonl(INADDR_ANY);

len=sizeof(server_addr);
if(bind(listen_socket,(struct sockaddr *)&server_addr,len)<0){
printf("bind error!\n");
exit(1);
}
listen(listen_socket,5);

sock_len=sizeof(client_addr);
maxfd=listen_socket;

FD_ZERO(&allset);
FD_SET(listen_socket,&allset);

memset(&client_addr,0,sizeof(client_addr));
while(1){

rset=allset;

select(FD_SETSIZE,&rset,NULL,NULL,NULL);

if(FD_ISSET(listen_socket,&rset)){
conn=accept(listen_socket,(struct sockaddr *)&client_addr,&sock_len);
FD_SET(conn,&allset);
printf("accept.....\n");
}else{
n=read(conn,buff,sizeof(buff));
buff[n]='\0';
printf("read is data:%s\n",buff);
}
}
close(listen_socket);
exit(0);
}


23,116

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧