c语言socket通信问题,小弟菜鸟,求大神指导下,谢谢
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言socket通信问题,小弟菜鸟,求大神指导下,谢谢相关的知识,希望对你有一定的参考价值。
SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0);
if(CreateSocketToServer(sockClient))//已正确创建套接字
if(ConnectToServer(sockClient,flag))//已正确连到服务器
CString sendInfo,recvInfo;
sendInfo="Hello,Sever "+name+" "+passwd+"\n
if(SendInfoToServer(sockClient,sendInfo,flag))//已向服务器发送验证数据
cout<<"向服务器发送用户名和密码:"<<sendInfo<<endl;
recvInfo=RecvInfoFromServer(sockClient,flag);
MessageBox("接收到信息为:"+recvInfo);
if(recvInfo!="false")//得到服务器确认信息
cout<<"客户端接收到服务器响应:"<<recvInfo<<endl;
while(连接服务器成功)
/*我想在得到服务器的确认消息后,新建一个线程与服务端进行通信,但是while的判断
*语句条件是该socket连接仍然存在,但是我百度了下,都说socket不能使用两次connect,
* 那我这里应该怎么判断呢,谢谢各位...
*/
CloseSocketToServer(sockClient);
恩,我明白你的意思了,我还有个问题,就是当程序运行过connect后,继续运行send操作后,这时我断开服务端后,应该是服务断开了呀,应该是接不到什么了,为什么客户端还会接受到一个空消息呢
追答这是windows socket机制的问题,在windows下是返回一个空消息,在linux下是返回-1 但是在arm下,如果你断开了,但你没有判断就直接recv,那就会提示你段错误了
追问非常感谢你的热心,还有个问题想问下哈,我将开始创建的socketClient传递到新建的线程中,在线程中新建了一个自己写的socket类的对象,使用该对象的SendInfoToServer(sockClient,sendInfo,flag)与服务器进行通信,想着同一个socketClient,为什么程序会报错socket error 10038即没有建立socket,这是怎么回事呢
追答你是怎么传进去的,可能是你的传递方式有问题
追问百度这里字数有限制,我给你发了百度的私信了,呵呵,帮我看下,实在是麻烦你了。。。。
追答回你了
追问谢谢你,哈哈,问题解决了,谢谢,学长....,同时谢谢以下各位的回答,真心感谢....
参考技术A 我不明白你为什么要用while。。。用if就可以了啊。。把SOCEKET的套接字传到线程里面,继续用这个套接字做通信接口,完成你的业务逻辑。追问恩,我刚把它改成if了,,我还有个问题,就是当程序运行过connect后,继续运行send操作后,这时我断开服务端后,应该是服务断开了呀,应该是接不到什么了,为什么客户端还会接受到一个空消息呢
追答空消息?你是说你发送了密码以后收到一个空消息?还是你发送全部完成以后closesocket以后收到一个空消息?
追问感谢你哦,呵呵》。。。
参考技术B 把while也挪到新线程中去。各位java大神,小弟跪求一个解决的方案:调用外部接口得到返回值--耗时问题
目前遇到的问题是这样的:我取出一个LIst集合,每一条数据构建成一个参数去调用一个外部接口,但是得到接口返回值需要耗时,比如10秒,要是List有上万条数据,那一次循环完得多少个小时了,求怎么解决啊 ,下面是我的伪代码:
For (int i =0;i<list.size();i++)
string returnstr = getResult();//调用外部接口得到返回值,这里可能耗时(比如10秒);
updateDate(returnstr).//根据返回值更新数据库的数据
这样下来得好长时间啊 ,用什么方式解决好呢,求给设计代码啊,小弟跪求,我的分数全给了,大神帮帮啊
用到的技术我也了解 ,关键是不知道怎么用,求代码啊 ,谢谢大侠了
java中可以这样
long start = Calendar.getInstance().getTime().getTime();
string returnstr = getResult();//调用外部接口得到返回值,这里可能耗时(比如10秒);
long end= Calendar.getInstance().getTime().getTime();
long time = end-start;//这里是毫秒数,根据自己需要转换一下吧
updateDate(returnstr).//根据返回值更新数据库的数据
先看看到底需要多长时间,话说是不是java实现的啊?追问
嗯,就是java实现,能给伪代码吗,谢了,用什么技术呢
追答先写一个处理线程
package org.zcm.run;
public class MyRequestThread implements Runnable
//构造函数,传入请求路径或者参数,只要满足你的请求条件就行
private String param;
public MyRequestThread(String p)
param = p;
public void run()
String returnstr = getResult(param);//调用外部接口得到返回值,这里可能耗时(比如10秒);
updateDate(returnstr);//根据返回值更新数据库的数据
public String getResult(String param)
//这里写请求的方法,用connect或者client都可以
//这里如果请求比较复杂,或者要求比较严谨的话,建议用httpclient
String req = new String();
return req;
//这个方法要怎么实现你懂的
private void updateDate(String returnstr)
// TODO Auto-generated method stub
大概就是这样了。
然后循环调用
为了线程安全,可以用一些线程池来管理。
public class ListOperate
public static void main(String[] args)
//建立线程池
ExecutorService pool = Executors.newSingleThreadExecutor();
//测试数据
List params = new ArrayList();
params.add("1");
params.add("2");
for(String p:params)
Thread reqThread = new Thread(new MyRequestThread(p));
pool.execute(reqThread);
pool.shutdown();
还有别的线程池,用法查查就有了
以上是关于c语言socket通信问题,小弟菜鸟,求大神指导下,谢谢的主要内容,如果未能解决你的问题,请参考以下文章