linux下虚拟机socket编程问题

k_summer7 2009-03-24 10:58:26
我用linux虚拟机学习socket编程。windows下ip是自动分配的,
在linux下写了客户端和服务器程序,程序没有问题,是按照书上例题写的,
程序很简单,就是服务器监听客户端的消息,然后显示,
但运行就是不正常。
我想问一下,在虚拟机下做socket编程,是否需要特殊配置网络,
还是需要其他配置呢?
...全文
400 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
小新8111 2011-08-02
  • 打赏
  • 举报
回复
lz你的程序是哪儿搞过来的啊?
独孤过儿 2009-03-25
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#define SERVPORT 3333
#define BACKLOG 10
main()
{
int sin_size; // 這個變數未定義
int sockfd,client_fd;
struct sockaddr_in my_addr;
struct sockaddr_in remote_addr;
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror( "socket创建出错!"); exit(1);
}
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(SERVPORT);
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero( &(my_addr.sin_zero),8);
if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr)) == -1) {
perror( "bind出错!");
exit(1);
}
if (listen(sockfd, BACKLOG) == -1) {
perror( "listen出错!");
exit(1);
}
while(1) {
sin_size = sizeof(struct sockaddr_in);
if ((client_fd = accept(sockfd, (struct sockaddr *) &remote_addr, &sin_size))==-1) {
perror( "accept出错");
continue;
}
printf( "received a connection from %s\n", inet_ntoa(remote_addr.sin_addr));
if (!fork()) {
if (send(client_fd, "Hello, you are connected!\n", 26, 0) == -1)
perror( "send出错!");
close(client_fd);
exit(0);
}
close(client_fd);
}
}


// client.c
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define SERVPORT 3333
#define MAXDATASIZE 100

int main(int argc, char *argv[])
{
int sockfd, recvbytes;
char buf[MAXDATASIZE];
struct hostent *host;
struct sockaddr_in serv_addr;
if (argc < 2) {
fprintf(stderr,"Please enter the server's hostname!\n");
exit(1);
}
if((host=gethostbyname(argv[1]))==NULL) {
herror("gethostbyname出错!");
exit(1);
}
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
perror("socket创建出错!");
exit(1);
}
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(SERVPORT);
serv_addr.sin_addr = *((struct in_addr *)host->h_addr);
bzero( &(serv_addr.sin_zero),8);
if (connect(sockfd, (struct sockaddr *) &serv_addr, \
sizeof(struct sockaddr)) == -1) {
perror("connect出错!");
exit(1);
}
if ((recvbytes=recv(sockfd, buf, MAXDATASIZE, 0)) ==-1) {
perror("recv出错!");
exit(1);
}
buf[recvbytes] = '\0';
printf( "Received: %s",buf);
close(sockfd);
return 0;
}


運行結果:
[root][~]# ./server &
[1] 3282
[root][~]# gcc -o client client.c
[root][~]# ./client 192.168.198.128
received a connection from 192.168.198.128
Received: Hello, you are connected!
  • 打赏
  • 举报
回复
1)客户端程序要求输入主机IP,我windows和虚拟机的ip都是自动获取ip,我也不知道怎么获得我虚拟机的IP,
这种情况下,如何获取IP?
2)我试着随便输入一个ip,即在命令行下这样输入:
./client 192.168.1.5
结果显示段错误。

1.你可以在虚拟机下linux里开2个shell进程来运行代码。连接的ip用127.0.0.1就可以了。
lwh_1024 2009-03-25
  • 打赏
  • 举报
回复
如果你不知道主机的IP的话,你可以输入命令“hostname”查找主机名,把主机名写入gethostbyname(hostname)的参数。
然后你在/etc/hosts文件中查看,你的主机名一定要存在与hosts文件中,前面是ip,后面跟主机名。
如果你不知道ip,可以用root用户执行"ifconfig" 找到eth0网卡对应的IP就是了
k_summer7 2009-03-25
  • 打赏
  • 举报
回复
我的程序如下:
服务器端:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#define SERVPORT 3333
#define BACKLOG 10
main()
{
int sockfd,client_fd;
struct sockaddr_in my_addr;
struct sockaddr_in remote_addr;
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror( "socket创建出错!"); exit(1);
}
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(SERVPORT);
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero( &(my_addr.sin_zero),8);
if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr)) == -1) {
perror( "bind出错!");
exit(1);
}
if (listen(sockfd, BACKLOG) == -1) {
perror( "listen出错!");
exit(1);
}
while(1) {
sin_size = sizeof(struct sockaddr_in);
if ((client_fd = accept(sockfd, (struct sockaddr *) &remote_addr, &sin_size))==-1) {
perror( "accept出错");
continue;
}
printf( "received a connection from %s\n", inet_ntoa(remote_addr.sin_addr));
if (!fork()) {
if (send(client_fd, "Hello, you are connected!\n", 26, 0) == -1)
perror( "send出错!");
close(client_fd);
exit(0);
}
close(client_fd);
}
}
}

客户端:
#include<stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define SERVPORT 3333
#define MAXDATASIZE 100

void main(int argc, char *argv[])
{
int sockfd, recvbytes;
char buf[MAXDATASIZE];
struct hostent *host;
struct sockaddr_in serv_addr;
if (argc < 2) {
fprintf(stderr,"Please enter the server's hostname!\n");
exit(1);
}
if((host=gethostbyname(argv[1]))==NULL) {
herror("gethostbyname出错!");
exit(1);
}
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
perror("socket创建出错!");
exit(1);
}
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(SERVPORT);
serv_addr.sin_addr = *((struct in_addr *)host- >h_addr);
bzero( &(serv_addr.sin_zero),8);
if (connect(sockfd, (struct sockaddr *) &serv_addr, \
sizeof(struct sockaddr)) == -1) {
perror("connect出错!");
exit(1);
}
if ((recvbytes=recv(sockfd, buf, MAXDATASIZE, 0)) ==-1) {
perror("recv出错!");
exit(1);
}
buf[recvbytes] = '\0';
printf( "Received: %s",buf);
close(sockfd);
}

我分别用gcc分别编译服务器和客户端程序,生成server和client可执行文件。
然后在命令行下输入
./server &
让服务器在后台启动。
然后启动客户端程序,此时有两个问题,
1)客户端程序要求输入主机IP,我windows和虚拟机的ip都是自动获取ip,我也不知道怎么获得我虚拟机的IP,
这种情况下,如何获取IP?
2)我试着随便输入一个ip,即在命令行下这样输入:
./client 192.168.1.5
结果显示段错误。

请问这段程序有问题没有,如果没有问题,该如何正确运行这段程序?
请大虾告知~~
k_summer7 2009-03-25
  • 打赏
  • 举报
回复
我试了一下,
还是不行,出错现象一致,
都是提示client端 段错误。
  • 打赏
  • 举报
回复
不需要什么配置,你能ping通,可以收包就可以了。
fox000002 2009-03-24
  • 打赏
  • 举报
回复
不正常是什么问题

不需要特别设置啊

23,116

社区成员

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

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