这又一个标准的对话模型, 你可以对昭一下程序, 估计是你的程序问题
连接成功要求几个条件 网络畅通 两端通讯地址对应 协议端口相同
以下引用的程序与实际程序略有出入, 下同)
sockfd = socket( AF_INET,SOCK_STREAM, 0);
// 首先建立一个 socket, 族为 AF_INET, 类型为 SOCK_STREAM.
// AF_INET = ARPA Internet protocols 即使用 TCP/IP 协议族
// SOCK_STREAM 类型提供了顺序的, 可靠的, 基于字节流的全双工连接.
// 由于该协议族中只有一个协议, 因此第三个参数为 0
bind( sockfd, ( struct sockaddr *)&serv_addr, sizeof( serv_addr));
// 再将这个 socket 与某个地址进行绑定.
// serv_addr 包括 sin_family = AF_INET 协议族同 socket
// sin_addr.s_addr = htonl( INADDR_ANY) server 所接受的所有其他
// 地址请求建立的连接.
// sin_port = htons( SERV_TCP_PORT) server 所监听的端口
// 在本程序中, server 的 IP和监听的端口都存放在 config 文件中.
listen( sockfd, MAX_CLIENT);
// 地址绑定之后, server 进入监听状态.
// MAX_CLIENT 是可以同时建立连接的 client 总数.
server 进入 listen 状态后, 等待 client 建立连接. 此时如果有
client 进行连接时, 也要先进行网络部分的初始化工作:
sockfd = socket( AF_INET,SOCK_STREAM,0));
// 同样的, client 也先建立一个 socket, 其参数与 server 相同.
connect( sockfd, ( struct sockaddr *)&serv_addr, sizeof( serv_addr));
// client 使用 connect 建立一个连接.
// serv_addr 中的变量分别设置为:
// sin_family = AF_INET 协议族同 socket
// sin_addr.s_addr = inet_addr( SERV_HOST_ADDR) 地址为 server
// 所在的计算机的地址.
// sin_port = htons( SERV_TCP_PORT) 端口为 server 监听的端口.
当 client 建立新连接时, server 使用 accept 来接受该连接:
accept( sockfd, (struct sockaddr*)&cli_addr, &cli_len);
// 在函数返回时, cli_addr 中保留的是该连接对方的信息
// 包括对方的 IP 地址和对方使用的端口.
// accept 返回一个新的文件描述符.
///////////////////////////////////
// 服务器程序
省略了错误检查) //
///////////////////////////////////
#include <stdio.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#define PORT 8000
#define MAXLOG 10
main(){
int sock,newsock;
struct sockaddr_in myaddr;
char *buf="hello!/n";
sock=socket(AF_INET,SOCK_STREAM,0);
myaddr.sin_family=AF_INET;
myaddr.sin_port=htons(PORT);
myaddr.sin_addr.s_addr=inet_addr("195.95.95.1");
bzero(&myaddr.sin_zero,8);
bind(sock,&my_addr,sizeof(struct sockaddr));
listen(sock,MAXLOG);
while(1){
newsock=accept(sock,NULL,NULL);
if(!fork()){
write(newsock,buf,strlen(buf));
close(newsock);
}
while(waitpid(-1,NULL,WNOHANG)>0);
}
}
///////////////////////////////////
// 客户端程序
省略了错误检查) //
///////////////////////////////////
#include <stdio.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#define PORT 8000
main(){
int sock;
struct sockaddr_in theiraddr;
char buf[256];
int n;
sock=socket(AF_INET,SOCK_STREAM,0);
theiraddr.sin_family=AF_INET;
theiraddr.sin_port=htons(PORT);
theiraddr.sin_addr.s_addr=inet_addr("195.95.95.1");
bzero(&their.sin_zero,8);
connect(sock,&their_addr,sizeof(struct sockaddr));
n=read(sock,buf,256):
if(n<0){
printf("read error!/n");
exit(0);
}
buf[n]='/0';
printf("%s",buf);
close(sock);
}
经编译后,在一个终端执行server,再开一个终端执行client,可以看到,在client终端上,会显示"hello!".