accept()函数如何工作?(How does the accept() function work?)
我有一个关于C中的
accept()
函数的问题当服务器接收到连接时,
accept()
函数会创建一个新的套接字与客户端进行通信,然后让“旧套接字”监听新的连接。然后,我明白服务器可以通过“新套接字”与客户端通信,但客户端如何与“新套接字”通信(因为客户端不知道这个“新套接字”)?
I have a question about the
accept()
function in C.When a server receive a connection, the
accept()
function creates a new socket to communicate with the client, and then let the "old socket" listening for new connections.Then, I understand that the server can communicate with the client through the "new socket", but how can the client communicate with the "new socket" (because the client don't know about this "new socket") ?
原文:https://stackoverflow.com/questions/41512735
最满意答案
我不完全确定你的所有日期都来自子选择,因为它们没有别名,但概念上我会尝试:
SELECT Name, ID, Date, Type = CASE WHEN Start_Date = Today_Date THEN 'NEW' WHEN Terminate_Date = Today_Date THEN 'TERMINATED' WHEN (SELECT MAX(DATE) FROM Employee_Reference ER on ER.ID = EM.ID) = GETDATE() THEN 'EXTENDED' WHEN ID = (SELECT MAX(Create_Date) FROM Name_Change AS NC ON NC.ID = EM.ID) = GETDATE() THEN 'Name Changed' END FROM Employee_Master EM WHERE Today_Date = GETDATE()
从本质上讲,这消除了employee_master中额外选择的ID,因为您已经从中进行选择,并从子选择中的目标表中选择最大日期。 你只会以这种方式得到一个,如果它符合今天的日期,那么它将满足案例陈述。
请注意,上面假设您的原始查询获得了整个人口。 但是,我怀疑您可能希望在FROM语句中实际包含employee_reference和name_change作为外连接,然后从WHERE语句中的当前日期过滤到所有内容 - 类似于:
SELECT Name, ID, Date, CASE WHEN Start_Date = Today_Date THEN 'NEW' WHEN Terminate_Date = Today_Date THEN 'TERMINATED' WHEN ID = (SELECT A.ID FROM Employee_Master AS A INNER JOIN Employee_Reference AS B on B.ID = A.ID WHERE DATE = GETDATE()) THEN 'EXTENDED' WHEN ID = (SELECT A.ID FROM Employee_Master AS A INNER JOIN Name_Change AS B ON B.ID = A.ID WHERE Create_Date = GETDATE()) THEN 'Name Changed' END AS Type FROM Employee_Master EM LEFT OUTER JOIN Employee_Reference ER ON ER.ID = EM.ID LEFT OUTER JOIN Name_Change NC ON NC.ID = EM.ID WHERE Today_Date = GETDATE() OR DATE = GETDATE() --note: you'll need to alias date since there appears to be more than one column named this OR Create_Date = GETDATE()
I'm not totally sure where all your dates are coming from in the subselects since they aren't aliased, but here is conceptually what I would try:
SELECT Name, ID, Date, Type = CASE WHEN Start_Date = Today_Date THEN 'NEW' WHEN Terminate_Date = Today_Date THEN 'TERMINATED' WHEN (SELECT MAX(DATE) FROM Employee_Reference ER on ER.ID = EM.ID) = GETDATE() THEN 'EXTENDED' WHEN ID = (SELECT MAX(Create_Date) FROM Name_Change AS NC ON NC.ID = EM.ID) = GETDATE() THEN 'Name Changed' END FROM Employee_Master EM WHERE Today_Date = GETDATE()
Essentially, this eliminates the extra selection of ID from employee_master, since you are already selecting from that, and selects the max date from the table targeted in the sub-select. You'll only get one back that way, and if it matches today's date then it will satisfy the case statement.
Note that the above assumes your original query gets the entire population. However, I suspect you might want to actually include employee_reference and name_change as outer joins in your FROM statement and then filter down to everything from the current date in your WHERE statement - something like:
SELECT Name, ID, Date, CASE WHEN Start_Date = Today_Date THEN 'NEW' WHEN Terminate_Date = Today_Date THEN 'TERMINATED' WHEN ID = (SELECT A.ID FROM Employee_Master AS A INNER JOIN Employee_Reference AS B on B.ID = A.ID WHERE DATE = GETDATE()) THEN 'EXTENDED' WHEN ID = (SELECT A.ID FROM Employee_Master AS A INNER JOIN Name_Change AS B ON B.ID = A.ID WHERE Create_Date = GETDATE()) THEN 'Name Changed' END AS Type FROM Employee_Master EM LEFT OUTER JOIN Employee_Reference ER ON ER.ID = EM.ID LEFT OUTER JOIN Name_Change NC ON NC.ID = EM.ID WHERE Today_Date = GETDATE() OR DATE = GETDATE() --note: you'll need to alias date since there appears to be more than one column named this OR Create_Date = GETDATE()
相关问答
更多-
如何在没有算术数的情况下在SQL子查询中使用GROUP BY(How to use GROUP BY in SQL subquery without arithmetic count)[2022-11-10]
是的,您可以在这种情况下使用组,但您需要创建内部查询的别名,如下所示: SELECT A.NAME, A.AGE, A.JOB FROM ( SELECT pe.name NAME, pe.age AGE, jb.`function` JOB FROM pearson pe, job jb ) A GROUP BY A.NAME, A.AGE, A.JOB; Yes you can use a group by in this case, but you will need to crea ... -
if(bList.get(i).getAccountNumber().equals(accountNumber)&& bList.get(i).getAccountNumber().equals(newAccountNumber)) 您正在检查同一帐户是否有两个不同的帐号 - accountNumber和newAccountNumber 。 这永远不会是真的。 您必须找到两个帐户,一个帐户具有第一个帐号,另一个帐户具有第二个帐号。 这样做的天真方法是使用嵌套的for循环: for(int i = 0; i ...
-
子查询中的HQL case语句(HQL case statement in subquery)[2023-10-24]
在你的代码中:units可能是一个集合(或者像这样),因为in语句需要一个集合,如果没有,它没有意义。 但是在when条件中:units is not null :units必须是一个单独的值(或NULL ),如果不是,语法不正确。 如果你想检查:units是否为null,那么你需要第二个参数,例如:number_of_units ,你检查一下 and ( case when :number_of_units != 0 then ( ti.toPrototype.unit in :units) ... -
使用Oracle中的Select Satement中的Case返回多个列(returning multiple columns using Case in Select Satement in Oracle)[2024-05-05]
这是另一种写入方式,它可能会解决关于访问第二个表多次的问题。 select col1,col2, case when col3='E01089001' then 1 else 2 end, case when col3='E01089001' then 3 else 4 end end from Table1, dual where col1='A0529'; 你的例子使用了一个明显简化的子查询,所以这个版本看起来很傻, 根本没有理由加入DUAL。 但在你真正的查询中,你可能会有一个像SELECT a, ... -
每次添加一个新怪物时,都会添加一组新的精灵Life1,Life2和Life3,叠加在之前的精灵上。 你可能想拥有一套生命之心。 在.h CCSprite *Life1,*Life2,*Life3; 在.m中,init方法 Life3 = [CCSprite spriteWithFile:@"heart.png"]; Life3.position = ccp(210,200); Life2 = [CCSprite spriteWithFile:@"heart.png"]; L ...
-
我不完全确定你的所有日期都来自子选择,因为它们没有别名,但概念上我会尝试: SELECT Name, ID, Date, Type = CASE WHEN Start_Date = Today_Date THEN 'NEW' WHEN Terminate_Date = Today_Date THEN 'TERMINATED' WHEN (SELECT MAX(DATE) ...
-
如何在SQL服务器上没有“WITH”或子查询的情况下简化此查询?(How can I simplify this query without “WITH” or Subquery on SQL server?)[2022-02-21]
CTE或子选择有什么问题? 以下是一些应该等同的方法: - 使用CROSS APPLY逐行计算 SELECT AR_Ref,StockDepots,StockStores ,ca.StockMulti FROM ArticleStock CROSS APPLY(SELECT CASE WHEN StockDepots > 0 AND StockStores > 0 THEN StockDepots + StockStores ... -
如果你已经展示了你尝试过的东西会更好。 这就是说,这应该工作: $result = App\TablenameModel::where('ProductId', 'your_value_here') ->select( \DB::raw('IF((SELECT COUNT(*) FROM tablename t WHERE t.field1 = tablename.field1 AND t.field2 IN (50,55,58,60)) = 0,1,0) AS b'), ...
-
问题是您的binary列既不是聚合也不是GROUP BY子句的成员。 您可以将case复制到GROUP BY ,也可以将子查询替换为: SELECT a.client_id , MAX(CASE WHEN b.client_id IS NOT NULL THEN 1 ELSE 0 END) as binary FROM account a LEFT OUTER JOIN account b ON a.client_id=b.client_id AND b.display_name='b' G ...
-
可能不是最快的解决方案,但是只要你有一个想要重新聚合的结果,就可以使用subselect。 SELECT ty, SUM(C1) as [C1], SUM(C2) as [C2], SUM(CHco) as [CHCo], SUM(N) as [N] FROM ( // your original query ) as subselect GROUP BY ty Might not be the fastest solution, but whenever you have a ...