指针传递有关问题,指针作为返回参数返回,成功接收后在传递给其他函数
指针传递问题,指针作为返回参数返回,成功接收后在传递给其他函数
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#define BACKLOG 10
/*服务器端套接字*/
int socketserver (char *pcPort)
{
printf("socket服务端开始\n");
/*变量定义*/
int iListen; /*监听套接字描述符*/
int iTransfer; /*数据传送套接字描述符*/
int iJudge = 0; /*存储返回值判定操作是否成功*/
int iIndex = 0; /*索引标记*/
int iLengthaddr = sizeof(struct sockaddr_in); /*存储地址长度*/
int iFor; /*for语句变量*/
int iRet;
struct sockaddr_in stLocaladdr; /*本机地址信息存放地址结构体*/
struct sockaddr stRemoteaddr; /*远端地址信息存放地址结构体*/
printf("服务端输出pcPort指针字符串为%s\n", pcPort);
/*创建套接字*/
iListen = socket(AF_INET, SOCK_STREAM, 0); /*创建socket,互联网协议族,面向TCP协议联系*/
if(iListen == -1)
{
printf("socket创建失败\n");
return 0;
}
else
{
printf("socket创建成功\n");
printf("socket ID是 %d\n", iListen);
}
/*地址结构题初始化*/
bzero (&stLocaladdr, sizeof(stLocaladdr));
stLocaladdr.sin_family = AF_INET; /*socket使用TCP协议族*/
stLocaladdr.sin_port = htons(atoi(pcPort)); /*端口的字节顺序转换成网络顺序的字节*/
stLocaladdr.sin_addr.s_addr = htonl(INADDR_ANY);
printf("端转换为数字端口值为%d\n", atoi(pcPort));
/*绑定服务器地址、端口和socket */
iJudge = bind(iListen, (struct sockaddr*)&stLocaladdr, sizeof(stLocaladdr));
if(iJudge == -1)
{
printf("绑定本机地址信息出错\n");
return 0;
}
else
{
printf("绑定地址成功\n");
printf("绑定端口为%d\n", htons(atoi(pcPort)));
printf("绑定IP地址为%ld\n", htonl(stLocaladdr.sin_addr.s_addr));
}
/*启用监听*/
iJudge = listen(iListen, BACKLOG); /*监听最大完成连接队列数为10*/
if(iJudge == -1)
{
printf("监听出错\n");
perror("listen");
}
else
{
printf("listenning......\n");
}
/*接受链接请求*/
while(1)
{
iTransfer = accept(iListen, (struct sockaddr*)&stRemoteaddr, &iLengthaddr);
if (iTransfer == -1)
{
printf("接受连接请求失败\n");
perror("accept");
continue;
}
if(!fork())
{
/*接收客户端发送消息*/
iRet = recv(iTransfer, &stRemoteaddr, sizeof(stRemoteaddr), 0);
if(iRet < 0)
{
printf("接收失败\n");
}
else
{
printf("接收成功\n");
}
}
}
close(iListen); /*关闭监听套接字*/
return 0;
}
char * pubetc(char *pcMark)
{
FILE *pfile;
char sLine[100];
char *p;
pfile = fopen ("/home/socket/etc/etc", "rb");
if (pfile == NULL)
{
printf ("打开文件失败\n");
getchar(); /*等待输入任意键结束*/
return 0;
}
/*一行一行获取配置文件中数据*/
while(fgets(sLine, sizeof(sLine), pfile))
{
if(memcmp(sLine, pcMark, strlen(pcMark)) == 0) /*找到文本中指定标记的一行*/
{
p = strtok(sLine, pcMark);
break;
}
}
printf("pubetc函数返回数据%s\n", p);
return p;
}
int main()
{
char * pcPort;
pcPort = pubetc("PORT:");
printf("main函数中获得的pcPort值为%s\n", pcPort);
socketserver(pcPort);
return 0;
}
配置文件内容
IP:127.0.0.1
PORT:5555
KEY:1024
TIME:3
运行输出结果为
pubetc函数返回数据5555
main函数中获得的pcPort值为5555
socket服务端开始
服务端输出pcPort指针字符串为B B€
socket创建成功
socket ID是 4
端转换为数字端口值为0
绑定地址成功
绑定端口为0
绑定IP地址为0
listenning......
为什么在main函数和pubetc函数中都能成功输出正确的结果,而传递到socketserver函数中输出的就是不是正确结果了??
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#define BACKLOG 10
/*服务器端套接字*/
int socketserver (char *pcPort)
{
printf("socket服务端开始\n");
/*变量定义*/
int iListen; /*监听套接字描述符*/
int iTransfer; /*数据传送套接字描述符*/
int iJudge = 0; /*存储返回值判定操作是否成功*/
int iIndex = 0; /*索引标记*/
int iLengthaddr = sizeof(struct sockaddr_in); /*存储地址长度*/
int iFor; /*for语句变量*/
int iRet;
struct sockaddr_in stLocaladdr; /*本机地址信息存放地址结构体*/
struct sockaddr stRemoteaddr; /*远端地址信息存放地址结构体*/
printf("服务端输出pcPort指针字符串为%s\n", pcPort);
/*创建套接字*/
iListen = socket(AF_INET, SOCK_STREAM, 0); /*创建socket,互联网协议族,面向TCP协议联系*/
if(iListen == -1)
{
printf("socket创建失败\n");
return 0;
}
else
{
printf("socket创建成功\n");
printf("socket ID是 %d\n", iListen);
}
/*地址结构题初始化*/
bzero (&stLocaladdr, sizeof(stLocaladdr));
stLocaladdr.sin_family = AF_INET; /*socket使用TCP协议族*/
stLocaladdr.sin_port = htons(atoi(pcPort)); /*端口的字节顺序转换成网络顺序的字节*/
stLocaladdr.sin_addr.s_addr = htonl(INADDR_ANY);
printf("端转换为数字端口值为%d\n", atoi(pcPort));
/*绑定服务器地址、端口和socket */
iJudge = bind(iListen, (struct sockaddr*)&stLocaladdr, sizeof(stLocaladdr));
if(iJudge == -1)
{
printf("绑定本机地址信息出错\n");
return 0;
}
else
{
printf("绑定地址成功\n");
printf("绑定端口为%d\n", htons(atoi(pcPort)));
printf("绑定IP地址为%ld\n", htonl(stLocaladdr.sin_addr.s_addr));
}
/*启用监听*/
iJudge = listen(iListen, BACKLOG); /*监听最大完成连接队列数为10*/
if(iJudge == -1)
{
printf("监听出错\n");
perror("listen");
}
else
{
printf("listenning......\n");
}
/*接受链接请求*/
while(1)
{
iTransfer = accept(iListen, (struct sockaddr*)&stRemoteaddr, &iLengthaddr);
if (iTransfer == -1)
{
printf("接受连接请求失败\n");
perror("accept");
continue;
}
if(!fork())
{
/*接收客户端发送消息*/
iRet = recv(iTransfer, &stRemoteaddr, sizeof(stRemoteaddr), 0);
if(iRet < 0)
{
printf("接收失败\n");
}
else
{
printf("接收成功\n");
}
}
}
close(iListen); /*关闭监听套接字*/
return 0;
}
char * pubetc(char *pcMark)
{
FILE *pfile;
char sLine[100];
char *p;
pfile = fopen ("/home/socket/etc/etc", "rb");
if (pfile == NULL)
{
printf ("打开文件失败\n");
getchar(); /*等待输入任意键结束*/
return 0;
}
/*一行一行获取配置文件中数据*/
while(fgets(sLine, sizeof(sLine), pfile))
{
if(memcmp(sLine, pcMark, strlen(pcMark)) == 0) /*找到文本中指定标记的一行*/
{
p = strtok(sLine, pcMark);
break;
}
}
printf("pubetc函数返回数据%s\n", p);
return p;
}
int main()
{
char * pcPort;
pcPort = pubetc("PORT:");
printf("main函数中获得的pcPort值为%s\n", pcPort);
socketserver(pcPort);
return 0;
}
配置文件内容
IP:127.0.0.1
PORT:5555
KEY:1024
TIME:3
运行输出结果为
pubetc函数返回数据5555
main函数中获得的pcPort值为5555
socket服务端开始
服务端输出pcPort指针字符串为B B€
socket创建成功
socket ID是 4
端转换为数字端口值为0
绑定地址成功
绑定端口为0
绑定IP地址为0
listenning......
为什么在main函数和pubetc函数中都能成功输出正确的结果,而传递到socketserver函数中输出的就是不是正确结果了??